一、简单工厂模式
简单工厂模式又称为静态工厂方法模式,属于类的创建模式。通过传不同的参数实现不同类的实例化并返回实例化后的对象。
优点:对类进行统一实例化,当类名或类的参数变动时不用去全局查找并修改,只需工厂一处修改即可;如果使用到Interface,定义了一个公共类(Common)的话,所有实现的子类都有公共类中需要实现的方法(name);对类的调用方便,直接向工厂调用即可。
缺点:当需要创建的类越多越多时工厂类中的判断逻辑越来越多;新增类时需要修改代码添加逻辑,否则无法扩展。
<?php
interface Common
{
// 定义一个接口, 让子类实现
public function name();
}
class Class1 implements Common
{
public function name(): string
{
return 'Class1' . '<br/>';
}
}
class Class2 implements Common
{
public function name(): string
{
return 'Class2' . '<br/>';
}
}// 工厂类
class simpleFactory
{
public static function createObject(string $className): object
{
if (!empty($className) && class_exists($className)) {
if ($className == 'Class1') {
return new $className();
} elseif ($className == 'Class2') {
return new $className();
}
}
return new \stdClass();
}
}// 调用工厂类中静态方法实现类的实例化
echo simpleFactory::createObject('Class1')->name();
echo simpleFactory::createObject('Class2')->name();输出结果:
Class1 Class2
二、工厂方法模式
工厂方法模式是在简单工厂模式上的扩展,并加入了抽象。当增加类时,只需要增加一个工厂类的文件,在文件中实现抽象工厂中的方法,并实例化返回这个类独有的工厂类对象。这样使统的扩展性变得很好,符合面向对象编程的开闭原则。工厂方法模式把原来简单工厂模式中的createObject细节分开放到子类中去实现。
<?php
interface Common
{
// 定义一个接口, 让子类实现
public function name();
}
class Class1 implements Common
{
public function name(): string
{
return 'Class1' . '<br/>';
}
}
class Class2 implements Common
{
public function name(): string
{
return 'Class2' . '<br/>';
}
}// 工厂方法类
abstract class methodFactory
{
protected abstract static function createObject();
}// 实现Class1工厂
class Class1Factory extends methodFactory{
public static function createObject(): object
{
return new Class1();
}
}// 实现Class2工厂
class Class2Factory extends methodFactory{
public static function createObject(): object
{
return new Class2();
}
}// 调用工厂方法 echo Class1Factory::createObject()->name(); echo Class2Factory::createObject()->name();
输出结果:
Class1 Class2
三、抽象工厂模式
抽象工厂模式是在工厂方法模式上的扩充,支持多个工厂的抽象方法的实现。将多个类统一到一个工厂中实现。当再增加一个抽象工厂(abstractFactory)中要实现的方法时,需要修改(abstractFactory)类和实现工厂类的子类代码。增加了工厂类的抽象性和理解难度。
<?php
interface Class1
{
// 定义一个接口, 让子类实现
public function name();
}
class ClassA implements Class1
{
public function name(): string
{
return 'ClassA name' . '<br/>';
}
}
class ClassB implements Class1
{
public function name(): string
{
return 'ClassB name' . '<br/>';
}
}
interface Class2
{
// 定义一个接口, 让子类实现
public function type();
}
class ClassC implements Class2
{
public function type(): string
{
return 'ClassC type' . '<br/>';
}
}
class ClassD implements Class2
{
public function type(): string
{
return 'ClassD type' . '<br/>';
}
}// 工厂方法类
abstract class abstractFactory
{
protected abstract static function createObjectName();
protected abstract static function createObjectType();
}class Obj1Factory extends abstractFactory{
public static function createObjectName(): object
{
return new ClassA();
}
public static function createObjectType(): object
{
return new ClassC();
}
}class Obj2Factory extends abstractFactory{
public static function createObjectName(): object
{
return new ClassB();
}
public static function createObjectType(): object
{
return new ClassD();
}
}echo Obj1Factory::createObjectName()->name(); echo Obj1Factory::createObjectType()->type(); echo Obj2Factory::createObjectName()->name(); echo Obj2Factory::createObjectType()->type();
ClassA name ClassC type ClassB name ClassD type
