文章《设计模式之简单工厂模式》介绍了简单工厂模式,并且分析了优缺点,其中的一大缺点是工厂类负责全部的具体产品的创建,那么具体产品类不断增多的时候,就需要去修改工厂的代码,进而违反了设计模式经典的开闭原则。
那么如何解决这个问题呢?工厂模式就闪亮登场了。
工厂模式组成:
1、抽象工厂角色(ProductFactory):是具体工厂角色必须继承的父类(Java中也可以通过实现接口来完成),这是工厂模式的核心。
2、具体工厂角色(ConcreteProductFactory):类似于简单工厂模式中的简单工厂角色,负责生产具体的产品对象。
3、抽象产品角色(Product):与简单工厂模式中的抽象产品角色一样,它是具体产品继承的父类(Java中也可以实现接口)。
4、具体产品角色(ConcreteProduct):简单工厂模式中的抽象产品角色一样,是指具体的产品,是客户端调用工厂的目的就是获取产品对象,在工厂模式中通常拥有多个具体产品。一般来讲是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。
这里继续通过《设计模式之简单工厂模式》中的例子讲解,以便更好的理解上述内容:
有一个Fruit基类(抽象产品角色),实现了produce方法 。Fruit类的两个子类Apple和Banana(具体产品角色),重写了produce方法。同时还有一个抽象工厂类FruitFactory(抽象工厂角色),实现了fruitProduce的方法。FruitFactory类的两个子类AppleFactory和BananaFactory(具体工厂角色),重写了fruitProduce的方法。
客户端使用不同的工厂类,通过不同的工厂调用fruitProduce方法来生产不同的水果。
Python代码实现如下:
有了不同的水果工厂,客户端就可以使用不同的水果工厂生成不同的水果了:
工厂模式不仅具有简单工厂模式的优点,并且通过继承自抽象工厂角色的多个具体工厂角色来代替简单工厂模式中的万能的"简单工厂角色",使得工厂角色能够得以细化,更易维护。
使用工厂模式也可以使结构变得灵活起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色来生成对应的具体的产品和具体的工厂,那么就可以被客户端使用,而不必去修改任何已有的代码。可以看出工厂角色的结构设计是符合开闭原则(对于扩展是开放的,对于修改是关闭的)的。这样使得添加具体工厂类或者具体产品类变非常容易,代码也非常容易维护。
你理解了工厂模式了吗?它与简单工厂模式的区别你领悟了吗?
(完)
看完本文有收获?请转发分享给更多人
关注「Python那些事」,做全栈开发工程师
领取专属 10元无门槛券
私享最新 技术干货