美文网首页
设计模式(五):工厂模式,抽象工厂模式

设计模式(五):工厂模式,抽象工厂模式

作者: 骑着母猪砍大象 | 来源:发表于2018-12-05 20:58 被阅读7次

转载请注明作者和出处https://www.jianshu.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();

输出结果

我是有钱女人
我是有钱人

我是漂亮女人
我是帅哥


可以看的出,抽象工厂可以运行多个生产线(用来生产不同产品种类的全部产品),工厂只可以运行一个生产线(同一等级结构中的固定产品)。我们只要了解了抽象工厂,另外两个模式相比较简单很多。工厂模式用的相比较而言比较少,学习在于厚积薄发,加油。

相关文章

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • Android 源码设计模式解析与实战 读书笔记 6 抽象工厂模

    创建型设计模式 —— 抽象工厂模式 1. 抽象工厂模式介绍 抽象工厂模式(Abstract Factory Pat...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • 设计模式系列-抽象工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 抽象工厂模式 抽象工厂模式 定义 抽象工...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • Go语言设计模式(3)抽象工厂模式

    Go语言设计模式(3)抽象工厂模式 抽象工厂模式的定义 抽象工厂模式的定义如下: Provide an inter...

  • 创建型设计模式

    一 . 工厂模式 二. 抽象工厂设计模式

网友评论

      本文标题:设计模式(五):工厂模式,抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/rfzwcqtx.html