当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 15:14:56 PHP

上一篇介绍了简单工厂模式和工厂方法模式。今天我们就来介绍一下抽象工厂模式。我们也使用上面的例子。接续以上,工厂采用新的设计模式后,生产力爆棚。然而,好景不长。突然有一天,一个新的需求来了:现在的电影和音乐不符合大众精致的喜好。我们想要制作流行音乐、小众音乐、流行电影、小众电影(关键词:流行、小众、电影、音乐)。工厂经过一番深思熟虑,好办!interfaceArtFactory{//创建音乐方法publicfunctioncreateMusic();//创建电影方法publicfunctioncreateMovie();}我们先创建一个美术工厂界面,里面有两条生产线,分别制作电影和音乐。接下来我们创建两个子工厂(实现艺术工厂接口的方法),分别生产流行音乐和电影、小众音乐和电影。//PopFactoryclassPopArtFactoryimplementsArtFactory{/***PopMovie**@returnPopMoive*/publicfunctioncreateMovie(){//TODO:实现createMovie()方法。返回新的PopMoive();}/***流行音乐**@returnPopMusic*/publicfunctioncreateMusic(){//TODO:实现createMusic()方法。返回新的流行音乐();}}//NicheFactoryclassNotPopArtFactoryimplementsArtFactory{/***CreateMusic**@returnNotPopMusic*/publicfunctioncreateMusic(){//TODO:实现createMusic()方法。返回新的NotPopMusic();}/***制作电影``**@returnNotPopMovie*/publicfunctioncreateMovie(){//TODO:实现createMovie()方法。返回新的NotPopMovie();}}同时我们还定义了两个产品(接口):电影和音乐产品Products:popmusic,nichemusic,popularmovies,nichemovies//流行音乐类PopMusicimplementsMusic{/***blackcatvoice*/publicfunctiongenerate(){//TODO:Implementvoice()method.p('流行音乐~');}}//音乐类NotPopMusic实现Music{publicfunctiongenerate(){//TODO:实现generate()方法。p('音乐~');}}//热门电影类PopMovie实现Movie{publicfunctiongenerate(){//TODO:实现generate()方法。p('热门电影~');}}//小众电影类NotPopMovice实现Movie{publicfunctiongenerate(){//TODO:实现generate()方法。p('小众电影~');}}现在工厂已经创建好了,产品也已经规划好了,让我们开足马力吧。通过这个例子,我们可以看出抽象工厂模式适用于生产所有不同类型的产品。如果我们要生产新的产品,比如漫画,那么我们就需要修改添加产品的接口,同时增加产品的定义,需要修改很多,不符合开闭原则。涉及到的工厂模型在两篇文章中有介绍。举这些例子,总结一下:工厂模式,顾名思义。作为工厂,我们可以通过产品获得产品,而不用关心产品。具体的生产过程——松耦合,通过不同类型的工厂和不同的产品组合,我们可以从不同的工厂得到我们想要的产品——可扩展。简单工厂模式真的只适用于简单模式,即功能单一的工厂生产单一的产品。工厂方法模式适用于生产同类型的多种产品,但不能为产品增加新的属性。抽象工厂模型适用于生产所有不同类型的产品,但不能添加新产品。