工厂方法来源于简单工厂模式,继承简单工厂模式的优点同时又弥补了简单工厂模式的缺点,工厂方法模式将具体产品的创建过程延迟到了抽象工厂的子类中即就是具体工厂类中,添加新的产品的时候只需要创建一个新的具体工厂类就可以完美的解决,更好的符合了开闭原则。
from abc import abstractmethod,ABCMeta
class AbstractProductHandler(metaclass=ABCMeta) :
#抽象产品类
@abstractmethod
def doOperation(self):
pass
class ConcrentProductHandler(AbstractProductHandler) :
#具体产品类
def doOperation(self):
pass
class AbstarctFactoryHandler(metaclass=ABCMeta) :
#抽象工厂类
@abstractmethod
def getProduct(self):
pass
class ConcrentFactoryHandler(AbstarctFactoryHandler) :
#具体工厂类
def getProduct(self):
return ConcrentProductHandler()
class ClientHandler :
#客户端接口
def runner(self):
counter = ConcrentFactoryHandler().getProduct()
counter.doOperation()
- 优点
- 工厂方法隐藏了具体产品被实例化的具体细节,用户只关心创建产品的工厂,对外完全无需暴露创建的细节
- 加入新的产品的时候,无需修改抽象工厂以及抽象产品的接口, 以及其他具体工厂以及具体产品接口,只需要利用继承创建独立的具体工厂以及具体产品,极大的提高了系统的可拓展性,完美的符合了开闭原则
- 缺点
- 在添加新的产品的时候,需要对应编写新的具体产品类以及对应的具体工厂类,在一定的程度上增加了系统的复杂度。同时类的数量不断增加,在编译过程中带给系统额外的开销
- 抽象层的引入增加了系统的抽象性以及理解难度,增加了系统实现的难度