工厂模式是常用的模式之一(这点很重要~),属于创造型,从“工厂”的字面意思就可以看出》即工厂负责生产产品,客户只需要关注产品,而不是产品的生产过程。这样做的好处是降低客户与产品的耦合度,提高代码的复用率。工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式:只生产一种产品。如果你想要其他产品,对不起,我不能生产。只能在最基础的层面上解决客户和工厂之间的耦合问题。具体代码逻辑:使用静态方法创建对象。工厂方法模式:在简单工厂的基础上,可以生产多个同类型的产品,但不能给产品增加新的功能(因为不符合开闭原则)。具体代码逻辑:去除简单工厂模式中创建对象的静态方法,定义创建工厂的接口(基类),具体工厂可以实现(或继承)工厂接口(或基类),并定义产品(或基类)的接口,具体的产品可以实现(或继承)产品的接口(基类),工厂实际生产什么产品,交给具体的工厂类和具体的产品类。这样,我们增加了同类型产品的新工厂,但是不能给产品增加新的特性(因为不符合开闭原则)。抽象工厂模式:不同的工厂可以生产出具有相同属性的不同产品,但是不能生产出没有上报过的新产品(因为不符合开闭原则)。具体代码逻辑:提供创建工厂的接口。在这个界面中,需要声明工厂可以生产哪些产品。同时,它提供了创建这些产品的接口。在这个接口中,需要声明产品的属性,使得具体工厂可以在现有产品的基础上进行升级改造,但是没有声明的新产品是不能生产的(因为它们不符合开闭原则)。例:我想要一个美术作品的制作人,我想制作我手上的电影作品(包括艺术家和作品名称)。好吧,如果需求简单,那就用简单工厂模式,按照老规矩写代码:;}}我们创建了一个电影工厂来制作电影作品。classMovieProduction{//艺术家受保护$_artist=null;//工作名称受保护$_production=null;/***设置艺术家*@paramdouble$numnumber*@returnvoid*/publicfunctionsetArtist($name){$this->_artist=$name;}/***获取艺术家**@returnnull*/publicfunctiongetArtist(){return$this->_artist;}/***设置艺术品**@paramnull$production*/publicfunctionsetProduction($production){$this->_production=$production;}/***获取生产**@returnnull*/publicfunctiongetProduction(){return$this->_production;}/***获取作品**@returnstringstring*/publicfunctiongetMovie(){return'From'.$this->_artist。'电影作品:《' . $this->_production . '》';}}电影作品包括艺术家(artist)和作品(production)两条信息。还有一个方法getMovie,直接获取商品。具体调用://创建电影工厂$movie_factory=newMovieFactory();//电影工厂生产一部电影$movie=$movie_factory->generateMovie();//设置电影的艺术家$movie->setArtist('张三');//设置电影名称$movie->setProduction('张三的电影');//获取电影长平echo$movie->getMovie()."\r\n";结果:来自张三的电影作品:《张三的电影》SimpleFactorySimple。经过一段时间的制作,感觉影片的输出还是不错的。这时候,我也想把手中的音乐作品制作出来。如果我使用一个简单的工厂,我需要创建一个音乐工厂来生产音乐产品。再过一段时间,我要制作动漫,需要创建一个动漫工厂来制作动漫。又通过了。.....最后的工厂棋子!!!这时候工厂就会觉得每次都得折腾,太累了,我需要想一个高效的方法,这样每次想出类似的新产品,只需要考虑产品的最终生产,不需要考虑工厂创建的问题。是的,我们来看看工厂方法模式:interfaceArtFactory{/**``*generateart**@returnmixed*/publicfunctiongererateArt();}我们先创建一个工厂接口(当然抽象基类是alsoavailable),这个内部方法负责具体生产什么产品,并不关心工厂的创建。接下来,制作电影:classMovieFactoryimplementsArtFactory{/***形成电影艺术**@returnmixed*/publicfunctiongererateArt(){//TODO:实现createOperate()方法。返回新的电影制作();}}specific工厂类负责具体的产品实现。我们还需要创建类似于产品的管道。这时候,我们创建一个产品的基类,classArtProduction{//artistprotected$_artist=null;//工作名称受保护$_production=null;/***设置艺术家**@paramdouble$numnumber*@returnvoid*/publicfunctionsetArtist($name){$this->_artist=$name;}/***获取艺术家**@returnnull*/publicfunctiongetArtist(){return$this->_artist;}/***设置生产**@paramnull$production*/publicfunctionsetProduction($production){$this->_production=$production;}/***获取生产**@returnnull*/publicfunctiongetProduction(){return$this->_production;}/***获取作品**@returnstringstring*/publicfunctiongetArt(){return'';}}具体产品只关心最后一个输出就行了,classMovieProductionextendsArtProduction{/***GetArt**@returnfloat|string|null*/publicfunctiongetArt(){return'From'.$this->_artist。'电影作品:《' . $this->_production . '》';}}具体调用过程://创建电影工厂$movie_factory=newMovieFactory();//电影工厂生产电影$movie=$movie_factory->gererateArt();//设置电影的艺术家$movie->setArtist('张三');//设置电影名称$movie->setProduction('张三的电影');//获取电影长平echo$movie->getArt()."\r\n";最后的执行结果:来自张三的电影作品:《张三的电影》这个时候,如果我们添加一段音乐的制作,就是添加一个音乐工厂,音乐产品就足够了。实现开闭原理并采用新模式后,工厂的生产效率提高了1000%。今天就说这么多吧。在下一篇文章中,我们会讲到工厂模式中的抽象工厂模式。
