设计模式抽象工厂模式

2次阅读

共计 1856 个字符,预计需要花费 5 分钟才能阅读完成。

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

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

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

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('小众电影~');
    }
}

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

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

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

  • 工厂模式就像他的名字一样,作为一个工厂,我们通过产品就能拿到产品,而不用关心产品的具体生产过程 – 松耦合,通过不同类型的工厂和不同产品组合,我们能从不同工厂得到我们想要的产品 – 可扩展。
  • 简单工厂模式,真的是只适合简单的模式,就是单一功能的工厂生产单一的产品。
  • 工厂方法模式,适合生产同一类型的各种产品,但是不能给产品增加新属性。
  • 抽象工厂模式,适合生产不同类型的全部产品,但是不能再增加新产品。
正文完
 0