其主要缺点:
(1)简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响;
(2)工厂类代码会非常臃肿,违背高聚合原则,违背开闭原则。
那么如果实现开闭原则呢?
对于之前的“水果工厂”的例子,使用工厂方法模式进行完善,即将工厂也抽象出来,一种具体工厂生产特定的水果。
#includeiostreamusingnamespacestd;//抽象的水果classAbstractFruit{public:virtualvoidshowName()=0;};//苹果classApple:publicAbstractFruit{public:virtualvoidshowName(){cout"这是苹果"l;}};//香蕉classBanana:publicAbstractFruit{public:virtualvoidshowName(){cout"这是香蕉"l;}};//鸭梨classPear:publicAbstractFruit{public:virtualvoidshowName(){cout"这是鸭梨"l;}};//抽象工厂classAbstractFactory{public:virtualAbstractFruit*createFruit()=0;};//实现苹果工厂classAppleFactory:publicAbstractFactory{public:virtualAbstractFruit*createFruit(){returnnewApple;}};//实现香蕉工厂classBananaFactory:publicAbstractFactory{virtualAbstractFruit*createFruit(){returnnewBanana;}};//实现鸭梨工厂classPearFactory:publicAbstractFactory{virtualAbstractFruit*createFruit(){returnnewPear;}};voidtest01(){AbstractFactory*factory=NULL;AbstractFruit*fruit=NULL;//创建苹果factory=newAppleFactory;//创建苹果工厂fruit=factory-createFruit();//创建苹果fruit-showName();//显示名称deletefruit;//释放水果deletefactory;//释放工厂//创建香蕉factory=newBananaFactory;//创建香蕉工厂fruit=factory-createFruit();//创建香蕉fruit-showName();//显示名称deletefruit;//释放水果deletefactory;//释放工厂//创建鸭梨factory=newPearFactory;//创建香蕉工厂fruit=factory-createFruit();//创建鸭梨fruit-showName();//显示名称deletefruit;//释放水果deletefactory;//释放工厂}intmain(intargc,int*argv[]){test01();system("pause");return0;}优点:
(1)不需要记住具体类名,甚至连具体参数都不用记忆;
(2)实现了对象创建和使用的分离;
(3)系统的可扩展性也就变得非常好,无需修改接口和原类。
缺点:
(1)增加系统中类的个数,复杂度和理解度增加;
(2)增加了系统的抽象性和理解难度。
应用场景:
(1)客户端不知道它所需要的对象的类。
(2)抽象工厂类通过其子类来指定创建哪个对象。
版权声明:文章来源网络聚合,如有问题请联系删除。





