1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
简单工厂模式 Simple Factory
简单工厂模式又称静态工厂方法,它属于类创建模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
简单工厂模式的角色
1.工厂类(Creator),工厂模式的核心,含有与应用业务逻辑处理的代码。
2.抽象产品(Abstract Product),被工厂创建实例的父类或拥有的共同接口。
3.具体产品(Concrete Product),任何被工厂创建的对象都是它的实例。
简单工厂的优点:
1.工厂类可以根据不同的参数创建不同的产品的实例,客户端可以免除直接创建产品。
2.创建产品实例的方法唯一,减少使用者的记忆。
3.通过配置文件,可以不修改任何客户端代码,即可实现更换和新增具体产品。
简单工厂的缺点:
1.由于工厂类集中了所有的产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2.使用简单工厂模式,会增加类的数量,在一定程度上增加系统的复杂度。
3.简单工厂模式使用了静态的工厂方法,造成工厂角色无法形成基于继承的等级结构。
php示例代码:
1 <?php 2 3 $vehicle = Factory::create("plane"); 4 $vehicle->run(); 5 6 7 abstract class vehicle{ 8 abstract function run(); 9 } 10 11 class Car extends vehicle{ 12 13 public function run(){ 14 print("汽车在路上行驶"); 15 } 16 } 17 18 class Plane extends vehicle{ 19 20 public function run(){ 21 print("飞机在天空翱翔"); 22 } 23 } 24 25 class Factory{ 26 27 public static function create($class){ 28 $class = ucfirst($class); 29 $vehicle = new $class(); 30 return $vehicle; 31 } 32 }
简单工厂适用环境
1.工厂负责类比较少
2.客户端只知道传入参数,对于如何创建对象不关心
工厂方法Factory Method
简单的工厂模式一旦程序出现问题,整个系统都无法正常工作,为了降低风险和维护难度,对其重构,所以引入工厂方法。工厂方法为工厂类定义了接口,用多态来削弱工厂类的职能。
相比简单工厂多了一个抽象工厂角色,它是与应用程序无关的,任何在模式中创建对象的工厂类必须实现这个接口。
工厂方法优点:
相比简单工厂模式,用户关心的是对应的工厂,在添加新的产品时,无需修改抽象工厂和抽象产品提供的接口,只需要实现一个具体的工厂和具体产品就可以了。
工厂方法缺点:
1.在添加新的产品时,需要添加两个类。
2.增加系统抽象性和理解难度。
适用环境:
一个类不知道它所需要的对象类,一个类通过其子类来指定哪个对象,将创建对象的任务委托给多个工厂子类中的某个类。
PHP示例代码:
1 <?php 2 $factory = new CarFactory(); 3 $vehicle = $factory->create(); 4 $vehicle->run(); 5 6 abstract class vehicle{ 7 abstract function run(); 8 } 9 10 class Car extends vehicle{ 11 12 public function run(){ 13 print("汽车在路上行驶"); 14 } 15 } 16 17 class Plane extends vehicle{ 18 19 public function run(){ 20 print("飞机在天空翱翔"); 21 } 22 } 23 abstract class Factory{ 24 abstract function create(); 25 } 26 27 class CarFactory extends Factory{ 28 29 public function create(){ 30 $vehicle = new Car(); 31 return $vehicle; 32 } 33 } 34 35 class PlaneFactory extends Factory{ 36 37 public function create(){ 38 $vehicle = new Plane(); 39 return $vehicle; 40 } 41 }
抽象工厂模式,下次再续。。。