设计模式--抽象工厂模式

多态苔藓
• 阅读 1645

上篇文章,我们介绍了简单工厂模式和工厂方法模式,今天我们要介绍一下抽象工厂模式。我们还用上面的例子。

接上文说,工厂采用了新的设计模式之后,生产力爆棚,可是,好景不长,突然有一天,新需求来了:目前的电影和音乐不太符合大众的精细化喜好了,我们想要生产流行音乐、小众音乐、流行电影、小众电影(关键词:流行、小众、电影、音乐)。

工厂经过一番深思熟虑之后,好办!

interface ArtFactory
{
    //创建音乐方法
    public function createMusic();
    
    //创建电影方法
    public function createMovie();
}

我们首先创建一个艺术工厂的接口,里面放生产电影和音乐的两条生产线。接下来我们来创建2个子工厂(要实现艺术工厂接口的方法),分别来生产流行音乐和电影、小众音乐和电影。

//流行工厂

class PopArtFactory implements ArtFactory
{
    /**
     * 流行电影
     *
     * @return PopMoive
     */
    public function createMovie()
    {
        // TODO: Implement createMovie() method.
        return new PopMoive();
    }
    
    /**
     * 流行音乐
     *
     * @return PopMusic
     */
    public function createMusic()
    {
        // TODO: Implement createMusic() method.
        return new PopMusic();
    }
}

//小众工厂
class NotPopArtFactory implements ArtFactory
{
    /**
     * 制造音乐
     *
     * @return NotPopMusic
     */
    public function createMusic()
    {
        // TODO: Implement createMusic() method.
        return new NotPopMusic();
    }
    
    /**
     * 制造电影``
     *
     * @return NotPopMovie
     */
    public function createMovie()
    {
        // TODO: Implement createMovie() method.
        return new NotPopMovie();
    }
}

同时我们还定义了两种产品(接口):电影和音乐

interface Movie
{
    public function generate();
}
interface Music
{
    public function generate();
}

按照之前的要求,我们创建了4中类型的产品:流行音乐、小众音乐、流行电影、小众电影。

//流行音乐

class PopMusic implements Music
{
    /**
     * black cat voice
     */
    public function generate()
    {
        // TODO: Implement voice() method.
    
        p('流行音乐~');
    }
}
//小众音乐

class NotPopMusic implements Music
{
    public function generate()
    {
        // TODO: Implement generate() method.
        p('小众音乐~');
    }
}
//流行电影

class PopMovie implements Movie
{
    public function generate()
    {
        // TODO: Implement generate() method.
    
        p('流行电影~');
    }
}
//小众电影

class NotPopMovice implements Movie
{
    public function generate()
    {
        // TODO: Implement generate() method.
        p('小众电影~');
    }
}

这样工厂创建好了,产品也规划好了,我们来开足马力工作吧。

通过这个例子我们可以看出来,抽象工厂模式适合用来生产不同类型的全部产品。如果想要生产新的产品,比如说漫画,那我们就需要修改增加产品的接口,同时增加产品的定义,这样需要修改很多地方,不符合开闭原则。

分两篇文章把涉及到的工厂模式介绍完了,通过举得这些例子,我们总结一下:

  • 工厂模式就像他的名字一样,作为一个工厂,我们通过产品就能拿到产品,而不用关心产品的具体生产过程--松耦合,通过不同类型的工厂和不同产品组合,我们能从不同工厂得到我们想要的产品--可扩展。
  • 简单工厂模式,真的是只适合简单的模式,就是单一功能的工厂生产单一的产品。
  • 工厂方法模式,适合生产同一类型的各种产品,但是不能给产品增加新属性。
  • 抽象工厂模式,适合生产不同类型的全部产品,但是不能再增加新产品。
点赞
收藏
评论区
推荐文章
happlyfox happlyfox
4年前
笑说设计模式-小白逃课被点名
关于我简介工厂模式(FactoryPattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。分类工厂模式可以分为三种,其中简单工厂一般不被认为是一种设计模式,可以将其看成是工厂方法的一种特殊
zdd小小菜鸟 zdd小小菜鸟
3年前
创建型-2-抽象工厂模式( Abstract Factory Pattern )
创建型2抽象工厂模式(AbstractFactoryPattern)抽象工厂模式(AbstractFactoryPattern)是围绕一个超级工厂创建其他工厂tex该超级工厂又称为其他工厂的工厂在抽象
Wesley13 Wesley13
4年前
Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦。详细分类:1)简单工厂模式(静态工厂模式);2)工厂方法模式;3)抽象工厂模式面向对象设计的基本原则:1)      OCP(开闭原则,OpenClosedPrinciple):一个软件的实体应当对扩展开放,对修改关闭。2)      
Wesley13 Wesley13
4年前
Unity C# 设计模式(二)简单工厂模式
定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该
Wesley13 Wesley13
4年前
Java描述设计模式(04):抽象工厂模式
一、抽象工厂模式1、生活场景汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。2、抽象工厂模式1.抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类;2.抽象工厂模式可以
Wesley13 Wesley13
4年前
Java进阶篇设计模式之三
前言在上一篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxuwujing%2Fp%2F9363142.html)中我们学习了工厂模式,介绍了简单工厂模式、工厂方法和抽象工厂模式。本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式。
Wesley13 Wesley13
4年前
Java中23种设计模式详解
Java中23种设计模式1\.设计模式31.1创建型模式41.1.1工厂方法41.1.2抽象工厂61.1.3建造者模式101.1.4单态模式131.1.5原型模式151.2结构型模式171.2.1适配器模式171.2.2桥接模式191.2.3组合
Stella981 Stella981
4年前
Python之设计模式
一、设计模式分类a、创建型模式简单工厂模式一、内容不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。二、角色工厂角色(Creator)抽象产品角色(Product)具体产品角色(ConcreteProduct)
Wesley13 Wesley13
4年前
C#设计模式 —— 工厂模式
。  工厂模式同样是项目中最常用的设计模式,工厂模式中又分为简单工厂,工厂方法,抽象工厂。下面我们由简单的开始逐一介绍。1.简单工厂模式  简单工厂又被称为静态工厂,在设计模式中属于创建型模式。主要解决的问题是封装了实例化的过程,通过传入参数来获不同实例。下面我们举一个项目中可能会用到的例子。  假设我们程序的数据保存在几个不同
Wesley13 Wesley13
4年前
C++ 深入浅出工厂模式(进阶篇)
介绍前文初始篇C深入浅出工厂模式(初始篇)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxiaolincoding%2Fp%2F11524376.html),主要阐述了简单工厂模式、工厂方法模式和抽象工厂模式的结构、特点和缺陷等。以
Wesley13 Wesley13
4年前
23种设计模式(面向对象语言)
一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。所有的创建型模式都有两个主要功能:  1.将系统所使用的具体类的信息封装起来  2.隐藏