工厂模式:
本来我们获取一个类的实例, 需要用new关键字, 但是如果在很多业务代码里面都实例化这个类, 如果类需要改名字, 那么就需要改很多地方
如果使用工厂模式, 不再使用new获取类的实例, 而是由工厂类提供类的实例, 降低了耦合性
工厂模式分为三种: 简单工厂模式、工厂模式、抽象工厂模式
<?php
class SimpleFactory
{
public static function createMan()
{
return new Man();
}
public static function createWoman()
{
return new Man();
}
}
class Man {}
class Woman {}
$man = SimpleFactory::createMan();
$woman = SimpleFactory::createWoman();
概念:
工厂模式和简单工厂模式类似, 唯一不同的是工厂模式允许多个工厂类存在, 相当于给工厂分组
规则:
- 每个工厂类必须继承一个抽象类或实现一个接口
- 每个产品类(工厂类生产产品类)必须继承一个抽象类或实现一个接口
- 每个工厂类必须有一个工厂方法返回产品类的实例
<?php
/**
* Interface Factory
*/
interface Factory
{
public function create();
}
/**
* Interface People
*/
interface People
{
public function say();
}
/**
* Class ManFactory
*/
class ManFactory implements Factory
{
public function create()
{
return new Man();
}
}
/**
* Class WomanFactory
*/
class WomanFactory implements Factory
{
public function create()
{
return new Woman();
}
}
/**
* Class Man
*/
class Man implements People
{
public function say()
{
return 'man';
}
}
/**
* Class Woman
*/
class Woman implements People
{
public function say()
{
return 'woman';
}
}
$manFactory = new ManFactory();
$man = $manFactory->create();
$womanFactory = new WomanFactory();
$woman = $womanFactory->create();
概念:
抽象工厂模式和工厂模式类似, 不同的是抽象工厂模式每个工厂类必须包含多个工厂方法
规则:
- 每个工厂类必须继承一个抽象类或实现一个接口
- 每个工厂类必须包含多个工厂方法
- 每个工厂方法返回产品类的实例
<?php
interface AbstractFactory
{
public function createAge();
public function createName();
}
interface Age {}
interface Name {}
class ManAge implements Age {}
class WomanAge implements Age {}
class ManName implements Name {}
class WomanName implements Name {}
class ManFactory implements AbstractFactory
{
public function createAge()
{
return new ManAge();
}
public function createName()
{
return new ManName();
}
}
class WomanFactory implements AbstractFactory
{
public function createAge()
{
return new WomanAge();
}
public function createName()
{
return new WomanName();
}
}