// 开发模式之工程模式 // 工厂模式: // 由工厂类根据参数来决定创建出哪一种产品类的实例; // 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。 // 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。 // 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类; //示例1 最基本的工厂模式 class Myname{ public function OutPutMyName(){ return 'name is rongyouyuan!~'; } } class NameFactory{ public static function Namefunc(){ return new Myname(); } } $obj=NameFactory::Namefunc(); echo $obj->OutPutMyName(); ?>
위는 가장 간단한 팩토리 패턴입니다. 다음은 팩토리 패턴을 사용하여 간단한 계산기를 구현합니다
<?php //定义一个抽象类 abstract class operation { protected $_numA = 0; protected $_numB = 0; protected $_result = 0; public function __construct($a, $b) { $this->_numA = $a; $this->_numB = $b; } //抽象方法所有子类必须实现该方法 protected abstract function getResult(); } //加法运算 class operationAdd extends operation { public function getResult() { $this->_result = $this->_numA + $this->_numB; return $this->_result; } } //减法运算 class operationSub extends operation { public function getResult() { $this->_result = $this->_numA - $this->_numB; return $this->_result; } } //乘法运算 class operationMul extends operation { public function getResult() { $this->_result = $this->_numA * $this->_numB; return $this->_result; } } //除法运算 class operationDiv extends operation { public function getResult() { $this->_result = $this->_numA / $this->_numB; return $this->_result; } } //定义工厂类 class operationFactory { //创建保存示例的静态成员变量 private static $obj; //创建实例的静态方法 public static function CreateOperation($type, $a, $b) { switch ($type) { case '+': self::$obj = new operationAdd($a, $b); break; case '-': self::$obj = new operationSub($a, $b); break; case '*': self::$obj = new operationMul($a, $b); break; case '/': self::$obj = new operationDiv($a, $b); break; } //最后返回这个实例 return self::$obj; } } //最后我们使用工厂模式 $obj = operationFactory::CreateOperation('+', 100, 20); echo $obj->getResult();
마지막으로 추상 팩토리
를 정의합니다. 관련 집합 또는 구체적인 클래스를 지정하지 않고 상호 의존적인 개체에 대한 인터페이스를 제공합니다.
유형: 클래스 패턴 생성
클래스 다이어그램:
추상 팩토리 패턴과 팩토리 메소드 패턴의 차이점
추상 팩토리 패턴은 팩토리 메소드 패턴의 업그레이드 버전으로, 관련되거나 상호 의존적인 객체 세트를 생성하는 데 사용됩니다. 팩토리 메소드 패턴과의 차이점은 팩토리 메소드 패턴이 제품 계층 구조를 대상으로 하는 반면 추상 팩토리 패턴은 여러 제품 계층 구조를 대상으로 한다는 것입니다. 프로그래밍에서 제품 구조는 일반적으로 인터페이스 또는 추상 클래스로 표현됩니다. 즉, 팩토리 메소드 패턴이 제공하는 모든 제품은 동일한 인터페이스 또는 추상 클래스에서 파생되는 반면 추상 팩토리 패턴이 제공하는 제품은 파생됩니다. 다른 인터페이스나 추상 클래스에서.
추상 팩토리 패턴에는 제품군 개념이 있습니다. 소위 제품군은 다양한 제품 계층 구조에 위치한 기능적으로 관련된 제품군을 의미합니다. 추상 팩토리 패턴에 의해 제공되는 일련의 제품은 제품군을 구성하는 반면, 팩토리 메소드에 의해 제공되는 일련의 제품은 계층 구조라고 합니다. 우리는 여전히 자동차 생산의 예를 사용하여 이들 간의 차이점을 설명합니다.
위의 클래스 다이어그램에서 해치백과 세단은 서로 다른 두 가지 계층 구조로 불리고, 2.0 배기량 자동차와 2.4 배기량 자동차는 서로 다른 두 제품군으로 불립니다. 보다 구체적으로 말하면, 2.0 배기량 해치백과 2.4 배기량 해치백은 동일한 레벨 구조에 속하고, 2.0 배기량 세단과 2.4 배기량 세단은 다른 레벨 구조에 속하며, 2.0 배기량 해치백과 2.0 배기량 세단은 다른 레벨 구조에 속합니다. 구조; 세단은 동일한 제품군에 속하며, 2.4 배기량 해치백과 2.4 배기량 세단은 다른 제품군에 속합니다.
계층 구조와 제품군의 개념을 이해하면 팩토리 메소드 패턴과 추상 팩토리 패턴의 차이점을 이해할 수 있습니다. 팩토리의 제품이 모두 동일한 계층 구조에 속한다면 팩토리 메소드 패턴; 팩토리의 제품이 여러 계층 구조인 경우 추상 팩토리 패턴에 속합니다. 이 예에서 공장 모델이 2.0 배기량 해치백과 2.4 배기량 해치백을 제공하는 경우 공장 모델이 2.4 배기량 해치백과 2.4 배기량 세단이라는 두 가지 제품을 제공하는 경우 이 공장 패턴 이는 추상 팩토리 패턴입니다. 왜냐하면 이 패턴이 제공하는 제품은 두 개의 서로 다른 계층 구조에 속하기 때문입니다. 물론, 공장이 네 가지 모델 모두에 대해 제품을 제공하는 경우 제품은 두 가지 계층 구조에 속하기 때문에 분명히 추상 공장 모델에도 속합니다.
추상 팩토리 패턴의 장점
팩토리 메소드 패턴의 장점 외에 추상 팩토리 패턴의 가장 큰 장점은 클래스 내의 제품을 제어합니다. 소위 제품군은 일반적으로 어느 정도 특정 상관 관계를 가지고 있습니다. 추상 팩토리 패턴은 관리를 위해 새로운 클래스를 도입하지 않고도 클래스 내 제품군의 상관 관계를 정의하고 설명할 수 있습니다.
추상 팩토리 패턴의 단점
제품군 확장은 제품군에 새로운 제품을 추가해야 하는 경우 거의 힘든 작업입니다. all 모든 팩토리 클래스를 수정해야 합니다. 따라서 추상 팩토리 패턴을 사용할 때 제품 계층 구조를 나누는 것이 매우 중요합니다.
적용 가능한 시나리오
생성할 객체가 일련의 상호 연관되거나 상호 의존적인 제품군인 경우 추상 팩토리 패턴을 사용할 수 있습니다. 더 명확하게 설명하면 상속 시스템에서 여러 계층 구조(즉, 여러 추상 클래스가 있음)가 있고 각 계층 구조에 속하는 구현 클래스 간에 특정 연관이나 제약 조건이 있는 경우 다음을 사용할 수 있습니다. 추상 공장 패턴입니다. 각 계층 구조의 구현 클래스 간에 관계나 제약 조건이 없는 경우 여러 개의 독립 팩토리를 사용하여 제품을 만드는 것이 더 적절합니다.
요약
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
<?php /** * 抽象工厂模式 * ------------- * @author zhaoxuejie <zxj198468@gmail.com> * @package design pattern * @version v1.0 2011-12-14 */ //--------------------------------------------------------------------------- // 抽象工厂(AbstractFactory)角色:它声明一个创建抽象产品对象的接口。 // 通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。 //--------------------------------------------------------------------------- // 具体工厂(ConcreteFactory)角色:实现创建产品对象的操作。 // 客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。 //--------------------------------------------------------------------------- // 抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。 //--------------------------------------------------------------------------- // 具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。 // 其内部包含了应用程序的业务逻辑。 //--------------------------------------------------------------------------- ///抽象工厂 interface AnimalFactory{ public function createCat(); public function createDog(); } //黑色动物具体工厂 class BlackAnimalFactory implements AnimalFactory{ function createCat(){ return new BlackCat(); } function createDog(){ return new BlackDog(); } } //白色动物具体工厂 class WhiteAnimalFactory implements AnimalFactory{ function createCat(){ return new WhiteCat(); } function createDog(){ return new WhiteDog(); } } //抽象产品 interface Cat{ function Voice(); } interface Dog{ function Voice(); } //具体产品 class BlackCat implements Cat { function Voice(){ echo '黑猫喵喵……'; } } class WhiteCat implements Cat { function Voice(){ echo '白猫喵喵……'; } } class BlackDog implements Dog { function Voice(){ echo '黑狗汪汪……'; } } class WhiteDog implements Dog { function Voice(){ echo '白狗汪汪……'; } } //客户端 class CLient{ public static function main(){ self::run(new BlackAnimalFactory()); self::run(new WhiteAnimalFactory()); } public static function run(AnimalFactory $AnimalFactory){ $cat=$AnimalFactory->createCat(); $cat->Voice(); $dog=$AnimalFactory->createDog(); $dog->Voice(); } } CLient::main();
更多php 开发模式之工厂模式相关文章请关注PHP中文网!