关于设计模式的文章网上一搜一大筐,此处我不想转帖前人,只是写下自己对每个设计模式的理解,可能会有不到之处,希望不要误导大家。
工厂模式分为简单工厂和抽象工厂,简单工厂也就是直接生产产品的,也就是在这种工厂里直接返回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();}