工厂模式分为,简单工厂,工厂方法,抽象工厂
简单工厂:主要特点,在工厂类中做判断,来创造对应的产品。
<?php
/**
* 工厂模式,简单工厂模式
*
* 主要是在工厂中做判断,从而创造相应的产品
*
* 缺点,增加新类型时,需更改工厂类
* 违反了开放封闭原则(软件实体,类,模块,函数)可以扩展
*
*/
define("ONE",1);
define("TWO",2);
class FactoryOne{
public function create()
{
}
}
class FactoryTwo{
public function create()
{
}
}
class Factory{
public function __construct()
{
}
public function create_instance($type)
{
if($type == ONE){
return new FactoryOne();
}else if($type == TWO){
return new FactoryTwo();
}
}
}
工厂方法:主要特点,创建对象的接口,让子类决定实例化哪个类,使一个类的实例化延迟到子类。
<?php
/**
* 工厂模式,工厂方法模式
*
* 定义一个用于创建对象的接口
*
* Factory Method 使一个类的实例化延迟到子类
*
* 缺点:没增加一个产品,则需要增加一个工厂
*
*/
abstract class SingleCore
{
abstract public function create();
abstract public function show();
}
class SingleA extends SingleCore
{
public function create()
{
parent::create(); // TODO: Change the autogenerated stub
}
public function show()
{
return '工厂A';
}
}
class SingleB extends SingleCore
{
public function create()
{
parent::create(); // TODO: Change the autogenerated stub
}
public function show()
{
return '工厂B';
}
}
abstract class FactoryMethod
{
public function create_instance()
{
}
}
class FactoryMethodA extends FactoryMethod
{
public function create_instance()
{
return new SingleA();
}
}
class FactoryMethodB extends FactoryMethod
{
public function create_instance()
{
return new SingleB();
}
}
抽象工厂:主要特点,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
<?php
/**
* 工厂模式,抽象工厂
*
* 以往,简单工厂和工厂方法模式,局限于一类产品,有一个共同的基类
* 要为不同类提供一个对象创建的接口,那么就要使用抽象工厂了
*
*/
abstract class SignleCore
{
abstract public function show();
}
abstract class MuliteCore
{
abstract public function show();
}
class SignleA extends SignleCore
{
public function show()
{
}
}
class SignleB extends SignleCore
{
public function show()
{
}
}
class MuliteA extends MuliteCore
{
public function show()
{
// TODO: Implement show() method.
}
}
class MuliteB extends MuliteCore
{
public function show()
{
// TODO: Implement show() method.
}
}
abstract class AbstractFactory
{
abstract public function createSingle();
abstract public function createMulite();
}
class FactoryA extends AbstractFactory
{
public function createSingle()
{
// TODO: Implement createSingle() method.
return new SignleA();
}
public function createMulite()
{
// TODO: Implement createMulite() method.
return new MuliteA();
}
}
class FactoryB extends AbstractFactory
{
public function createSingle()
{
// TODO: Implement createSingle() method.
return new SingleB();
}
public function createMulite()
{
// TODO: Implement createMulite() method.
return new MuliteB();
}
}