现在的位置: 首页 > 综合 > 正文

设计模式之工厂模式(一)

2018年02月05日 ⁄ 综合 ⁄ 共 1938字 ⁄ 字号 评论关闭

     关于设计模式的文章网上一搜一大筐,此处我不想转帖前人,只是写下自己对每个设计模式的理解,可能会有不到之处,希望不要误导大家。

    工厂模式分为简单工厂和抽象工厂,简单工厂也就是直接生产产品的,也就是在这种工厂里直接返回new 的产品,这样有一个问题,如果产品要很多,比如实现接口的类有很多,举个具体的例子,有animal这个接口,那生产的工厂类有生产cat,dog,pig,fish等等的方法,(cat,dog等实现接口),需要哪个生产哪个,但是突然有一天,科技发达了人类发现了外星人,比如火星人,木星人····都属于animal,那要生产这些动物就需要重写简单工厂方法,这样问题就来了,新发现一种动物就需要修改一次,这样这个简单工厂就永远不能封闭,不符合“开放--封闭”原则,即有新产品就需要增加工厂方法。

    结构如下:

                 interface animal{};

                class cat implements animal{};

                class dog implements animal{};

                 class animalFactory{ //简单工厂,生产不同产品

                      getCat(){return new cat();}

                       getDog(){return new dog();}//假如新增产品,这里就要get新的产品,永远不能关闭

                 }

     工厂方法模式很好的解决了这类问题,工厂方法把animalFactory再抽象成一个接口,catFactory,dogFactory等等工厂实现这个工厂基类,结构如下:

                 interface animal{};

                class cat implements animal{};

                class dog implements animal{};

                interface animalFactory{ getAnimal;};

                class catFactory implements animalFactory{ getAnimal(){return new cat();}}

                class dogFactory implements animalFactory{ getAnimal(){return new dog();}}

好处在这里就能体现出来了,假如新增waixingrenAnimal,就不必像简单工厂一样重写工厂方法了,这一工厂已经抽象为接口

只需要      class waixingren implements animal{};

                 class waixingrenAnimal implements animalFactory{getAnimal(){return new waixingren()}}

好处很明显,其实也是接口的好处。很好的解决了简单工厂方法不能关闭的问题

这里新的问题又来了,猫有很多种,有波斯猫,中国猫,美国猫,如果我想要中国猫你给我个美国猫,中国猫能抓老鼠事美国猫能抓吗?所以获取猫的方法也需要修改

结构就变成了:   

              interface animal {};

                 interface animalFactory{getCat; getDog;};

                  class ChineseFactory{getCat(){return ChineseAnimal();}  getDog(){return ChineseDog();}}

                  class AmericanFactory{getCat(){return AmericanCat();}  getDog(){return AmericanDog();}}

               abstract    animalImpl implements animalFactory{   getCat(){return };getDog;              }

                class catImpl extends animalImpl{  getChineseCat(){return ChineseCat();}

                                                                 getDog(){return ChineseDog();}                   

                 class dogImpl extends animalImpl{  getCat(){return ChineseCat();}

                                                                 getDog(){return ChineseDog();}         

                            

抱歉!评论已关闭.