转载请注明作者和出处://www.greatytc.com/p/e340fe8d69df
运行平台: Windows
php版本: php7.0
作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员
如果你还不知道什么是简单工厂,可以先去看看第一章:简单工厂模式
我们在之前第一章节的时候讲到,简单工厂模式,我看到很多文章把三个工厂放到一起讲,可是我感觉很多第一次接触设计模式的人大多接触的第一个模式就是简单工厂,这时候看工厂和抽象工厂很费力,于是我把这两个设计模式放到稍微后一点的地方。
我们之前提到过,简单工厂有两个缺点,第一是违背了类的开发闭合,第二是当维护的对象过多时难以维护。
我们先看看工厂模式和抽象工厂的代码
工厂模式:
工厂模式克服了简单工厂模式的开放闭合缺点,定义了一个创建工厂的接口,让子类选择想创建什么就创建什么工厂,但是工厂模式也就相当于只有一条生产线,而抽象工厂可以配合多个生产线。
//基础类接口
interface Person{
public function getName();
}
//男人
class Man implements Person{
public function getName()
{
echo "我是男人";
}
}
//女人
class Women implements Person{
public function getName()
{
echo "我是女人";
}
}
//工厂接口
interface Factory{
public function create();
}
//男人的工厂
class ManFactory implements Factory{
public function create()
{
return new Man();
}
}
//女人的工厂
class WoManFactory implements Factory{
public function create()
{
return new Women();
}
}
$manFactory = new ManFactory();
$manFactory->create()->getName();//输出男人
$womanFactory = new WoManFactory();
$womanFactory->create()->getName();//输出女人
输出结果
我是男人
我是女人
抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口。
//男人抽象
interface Man{
public function getName();
}
//帅男人
class PrettyMan implements Man{
public function getName()
{
echo "我是帅哥";
}
}
//有钱男人
class RichMan implements Man{
public function getName()
{
echo "我是有钱人";
}
}
// 抽象女人
interface Women{
public function getName();
}
// 漂亮女人
class PrettyWomen implements Women{
public function getName(){
echo '我是漂亮女人';
}
}
// 有钱女人
class RichWomen implements Women{
public function getName(){
echo '我是有钱女人';
}
}
//工厂
interface Factory{
public function createWomen();
public function createMan();
}
//有钱的工厂
class CreateRichFactory implements Factory{
public function createWomen()
{
return new PrettyWomen();
}
public function createMan()
{
return new PrettyMan();
}
}
//漂亮的工厂
class CreatePrettyFactory implements Factory{
public function createWomen()
{
return new RichWomen();
}
public function createMan()
{
return new RichMan();
}
}
//运行
$richFactory = new CreateRichFactory();
$richFactory->createWomen()->getName();
$richFactory->createMan()->getName();
echo "\n";
$prettyFactory = new CreatePrettyFactory();
$prettyFactory->createWomen()->getName();
$prettyFactory->createMan()->getName();
输出结果
我是有钱女人
我是有钱人我是漂亮女人
我是帅哥
可以看的出,抽象工厂可以运行多个生产线(用来生产不同产品种类的全部产品),工厂只可以运行一个生产线(同一等级结构中的固定产品)。我们只要了解了抽象工厂,另外两个模式相比较简单很多。工厂模式用的相比较而言比较少,学习在于厚积薄发,加油。