>백엔드 개발 >PHP 튜토리얼 >PHP 디자인 패턴(2)

PHP 디자인 패턴(2)

WBOY
WBOY원래의
2016-08-08 09:33:08930검색

최근부터 매주 최소 2개의 블로그를 업데이트하여 지난 주에 제가 겪은 문제나 새로운 아이디어를 기록하겠다는 목표를 세웠습니다. , 오랜 시간이 지나도 모든 것을 잊지 않기 위해 마스터했습니다. 둘째, 내 블로그 게시물이 그다지 좋지는 않지만 소수의 독자에게 어느 정도 영향을 미칠 수 있으며 점점 더 많이 작성한다고 믿습니다. 레벨도 점점 높아지고, 깊이도 점점 깊어지겠죠(ㅋㅋㅋ 전문적인 지식도 뛰어나고 글솜씨도 좋은 저 유명 블로거들도 부럽습니다). 일주일에 두 편의 기사를 기록하고 싶은 것을 모두 기록할 수는 없다는 것을 알게 되었습니다. 이번 주와 마찬가지로 로그 시스템, 바이너리 데이터 캐시(실제로는 하위 데이터베이스라고 부르는 것이 더 적절함)도 있습니다. QQwry.dat 데이터 해석, zip 압축 파일 추가 이런 대량 생성에 대해서는 글을 쓰지 않았는데 앞으로는 차차 블로그에 업데이트하겠습니다. 자, 이번에는 또 다른 모델을 소개하겠습니다.

  • 간단한 공장 모드

사실 이 모드도 상대적으로 흔해서 먼저 소개해야 할 것 같지만, 더 많은 싱글턴 모드를 접하게 되었기 때문에 먼저 싱글턴 모드를 소개하겠습니다. Simple Factory Pattern, 먼저 정의를 살펴보겠습니다. 디자인 패턴의 유형 측면에서 Simple Factory Pattern은 생성 패턴(Static Factory Method 패턴이라고도 함)이지만 23가지 GOF 디자인 패턴 중 하나는 아닙니다. 단순 팩토리 패턴은 팩토리 객체를 사용하여 생성할 제품 클래스 인스턴스를 결정합니다. 단순 팩토리 패턴은 팩토리 패턴 계열 중 가장 단순하고 실용적인 패턴으로, 다양한 팩토리 패턴을 특수하게 구현한 것으로 이해될 수 있습니다.

프로젝트에서 단순 공장 모델의 이점은 무엇인가요? 그에게는 두 가지 이점이 있습니다.

1. 첫 번째는 새로운 방법을 사용하여 서로 다른 클래스를 인스턴스화하는 대신 간단한 팩토리 패턴을 사용하여 서로 다른 매개변수에 따라 서로 다른 클래스를 인스턴스화하는 것입니다. 이는 사용자에게 더 나은 관리를 제공합니다.

2. 인스턴스화할 클래스가 여러 파일에서 사용되는 경우 클래스 이름을 수정할 때 클래스를 인스턴스화하는 모든 파일을 수정하는 대신 팩토리 클래스만 수정하면 됩니다. , 이는 드물다).

간단한 공장 패턴인 연산자 작업의 가장 고전적이고 가장 잘 이해되는 예를 살펴보세요.

단순 팩토리 패턴의 팩토리 클래스는 일반적으로 정적 메소드를 사용하여 서로 다른 매개변수를 허용하여 서로 다른 객체 인스턴스를 반환합니다. 코드가 하드 코딩되어 있으므로 코드를 수정하지 않고는 확장할 수 없습니다. 이는 OCP(확장 개발의 경우 원칙)를 위반합니다. 수정을 위해 폐쇄).

<?<span>php
</span><span>/*</span><span>*
 * 简单工厂模式&mdash;&mdash;经典运算符例子
 * @author 燕睿涛(luluyrt@163.com)
 </span><span>*/</span>
<span>/*简单</span><span>工********************厂********************类</span><span>*/</span>
<span>class</span><span> Operation{
    </span><span>/*</span><span>*
     * @var int $numa
     * 要操作的两个数字
     </span><span>*/</span>
    <span>protected</span> <span>$numa</span><span>;
    </span><span>protected</span> <span>$numb</span><span>;
    </span><span>public</span> <span>function</span> __construct(<span>$a</span>,<span>$b</span><span>){
        </span><span>$this</span>->numa = <span>$a</span><span>;
        </span><span>$this</span>->numb = <span>$b</span><span>;
    }

    </span><span>//</span><span>静态方法,通过接受不同的参数生成不同的对象实例</span>
    <span>public</span> <span>static</span> <span>function</span> create(<span>$operation</span>,<span>$a</span>,<span>$b</span><span>){
        </span><span>switch</span> (<span>$operation</span><span>) {
            </span><span>case</span> '+':
                <span>return</span> <span>new</span> Operationadd(<span>$a</span>,<span>$b</span><span>);
                </span><span>break</span><span>;
            
            </span><span>case</span> '-':
                <span>return</span> <span>new</span> Operationminus(<span>$a</span>,<span>$b</span><span>);
                </span><span>break</span><span>;
            </span><span>default</span>:
                <span>#</span><span> code...</span>
                <span>break</span><span>;
        }
    }

}
</span><span>/*</span><span>**********************************************</span><span>*/</span>

<span>/*</span><span>加法</span><span>*/</span>
<span>class</span> Operationadd <span>extends</span><span> Operation{
    </span><span>public</span> <span>function</span><span> doing(){
        </span><span>return</span> <span>$this</span>->numa + <span>$this</span>-><span>numb;
    }
}

</span><span>/*</span><span>减法</span><span>*/</span>
<span>class</span> Operationminus <span>extends</span><span> Operation{
    </span><span>public</span> <span>function</span><span> doing(){
        </span><span>return</span> <span>$this</span>->numa - <span>$this</span>-><span>numb;
    }
}

</span><span>$test</span> = Operation::create('+',2,56<span>);
</span><span>echo</span> <span>$test</span>->doing();
  • 공장 모드

저는 이전에 프로젝트에서 단순한 팩토리 패턴에 대해서만 접했습니다. 이 글을 작성하기 위해 정보를 확인한 결과 간단한 팩토리 패턴(정적 팩토리 패턴이라고도 함), 세 가지 팩토리 패턴이 있다는 것을 알게 되었습니다. 팩토리 패턴과 추상 팩토리 패턴을 읽어본 결과 그다지 유용하지 않다는 생각이 들었습니다. 이는 단지 OCP 원칙에 부합하는 것뿐입니다. 추상 제품 인터페이스와 추상 팩토리 인터페이스를 준수하는 신제품이 있는 경우에만 특정 제품과 팩토리를 확장해야 하며, 원래 코드를 수정할 필요가 없습니다. 팩토리 모드의 장점과 단점을 요약해 보겠습니다.

장점: 첫째, OCP 원칙을 준수하고 확장성이 향상됩니다. 둘째, 특정 팩토리 역할을 수정할 때 자신만의 팩토리 역할만 찾으면 되며, 필요가 없습니다. 다른 팩터리 역할 구현에 영향을 미칠까 봐 걱정합니다.

단점: 코드가 너무 많아 각 제품에 제품 클래스와 팩토리 클래스가 필요합니다. 이러한 단점은 단순한 팩토리 패턴과 팩토리 패턴을 결합하여 유사한 제품 클래스의 팩토리 클래스를 하나로 병합함으로써 달성할 수 있습니다.

<?<span>php
</span><span>/*</span><span>*
 * 简单工厂模式&mdash;&mdash;经典运算符例子
 * @author 燕睿涛(luluyrt@163.com)
 </span><span>*/</span>
<span>/*</span><span>工*********厂**********方**********法</span><span>*/</span>
<span>//</span><span>交通工具接口(抽象产品角色)</span>
<span>interface</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing();
}
</span><span>//</span><span>交通工具工厂接口(抽象工厂角色)</span>
<span>interface</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get();
}
</span><span>/*</span><span>具体产品角色</span><span>*/</span>
<span>class</span> car <span>implements</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing(){
        </span><span>echo</span> "My speed is 120KM/h \r"<span>;
    }
}

</span><span>class</span> bicycle <span>implements</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing(){
        </span><span>echo</span> "My speed is 30KM/h \r"<span>;
    }
}
</span><span>/*</span><span>具体工厂角色</span><span>*/</span>
<span>class</span> carfactory <span>implements</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get(){
        </span><span>return</span> <span>new</span><span> car();
    }
}
</span><span>class</span> bicyclefactory <span>implements</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get(){
        </span><span>return</span> <span>new</span><span> bicycle();
    }
}

</span><span>$test</span> = bicyclefactory::<span>get();
</span><span>$test</span>->runing();

저는 특정 프로젝트에서 팩토리 클래스를 사용한 적이 없습니다. 이야기를 할 때마다 좀 이상한 느낌이 듭니다. 잘못된 점이나 부적절한 점이 있으면 전문가나 선배님들 모두 지적해 주시길 바랍니다.

보내주세요~

이상 내용의 측면을 포함하여 PHP 디자인 패턴(2)을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.