上篇文章,我们介绍了简单工厂模式和工厂方法模式,今天我们要介绍一下抽象工厂模式。我们还用上面的例子。
接上文说,工厂采用了新的设计模式之后,生产力爆棚,可是,好景不长,突然有一天,新需求来了:目前的电影和音乐不太符合大众的精细化喜好了,我们想要生产流行音乐、小众音乐、流行电影、小众电影(关键词:流行、小众、电影、音乐)。
工厂经过一番深思熟虑之后,好办!
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('小众电影~');
}
}
这样工厂创建好了,产品也规划好了,我们来开足马力工作吧。
通过这个例子我们可以看出来,抽象工厂模式适合用来生产不同类型的全部产品。如果想要生产新的产品,比如说漫画,那我们就需要修改增加产品的接口,同时增加产品的定义,这样需要修改很多地方,不符合开闭原则。
分两篇文章把涉及到的工厂模式介绍完了,通过举得这些例子,我们总结一下:
- 工厂模式就像他的名字一样,作为一个工厂,我们通过产品就能拿到产品,而不用关心产品的具体生产过程 – 松耦合,通过不同类型的工厂和不同产品组合,我们能从不同工厂得到我们想要的产品 – 可扩展。
- 简单工厂模式,真的是只适合简单的模式,就是单一功能的工厂生产单一的产品。
- 工厂方法模式,适合生产同一类型的各种产品,但是不能给产品增加新属性。
- 抽象工厂模式,适合生产不同类型的全部产品,但是不能再增加新产品。