zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式

    简单工厂模式的回顾:

      简单工厂模式是指专门定义一个工厂类来负责创建产品类的实例,被创建的产品通常都具有共同的父类

      

      包含三个角色:

      简单工厂(SimpleProductFactory)角色:工厂模式的核心,负责生产具体的产品。工厂类可以被外部用户即客户端调用,创建产品对象,从而实现外部用户即客户端和产品对象的解耦。

      抽象产品(Product)角色:简单工厂模式所创建的具体产品对象的父类,负责描述所有产品对象的共有特征。
      具体产品(Concrete Product)角色:是指具体的产品,是客户端调用工厂的目的就是获取产品对象,在工厂模式中通常拥有多个具体产品。一般来讲是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。

      简单工厂模式优点:客户端与工厂进行交互,不再负责生产具体的产品对象,从而实现了解耦合。(单一职责,实现了解耦合)。

      简单工厂模式缺点:由于这个工厂类负责全部的具体产品的创建,那么具体产品类特别多时,我们就需要去修改工厂的代码,从而增大了维护难度,这样就违反了设计模式经典的开闭原则

    解决这个缺点的方案就是工厂模式。

    工厂模式组成: 
    1、抽象工厂角色(ProductFactory):是具体工厂角色必须继承的父类(Java中也可以通过实现接口来完成),这是工厂模式的核心。
    2、具体工厂角色(ConcreteProductFactory):类似于简单工厂模式中的简单工厂角色,负责生产具体的产品对象。 
    3、抽象产品角色(Product):与简单工厂模式中的抽象产品角色一样,它是具体产品继承的父类(Java中也可以实现接口)。

    4、具体产品角色(ConcreteProduct):简单工厂模式中的抽象产品角色一样,是指具体的产品,是客户端调用工厂的目的就是获取产品对象,在工厂模式中通常拥有多个具体产品。一般来讲是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。

    举个栗子:

    class Foot:
        "食品父类"
        def produce(self):
            print("Foot is produced")
    
    class Noodles (Foot):
        "面条子类"
        def produce(self):
            print("Noodles is produced")
    class Rice(Foot):
        "米饭子类"
        def produce(self):
            print("Rice is produced")
    
    
    class FootFactory:
        '''食品工厂'''
        def product(self):
            return Foot()
     
    class NoodleFactory:
        '''面条工厂'''
        def product(self):
            return Noodles()
    
    class RiceFactory:
        '''米饭工厂'''
        def product(self):
            return Rice()
    
    if __name__ == '__main__':
        #根据不同的工厂生产不同的食物
        noodlefactory = AppleFactory()
        noodle= noodlefactory .product()
        noodle.produce()
         ricefactory = RiceFactory()
        rice= ricefactory .product()
        rice.produce()

    当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色来生成对应的具体的产品和具体的工厂,那么就可以被客户端使用,而不必去修改任何已有的代码。可以看出工厂角色的结构设计是符合开闭原则

  • 相关阅读:
    .请写出常用的linux指令
    Maven常用命令有哪些
    Maven的工程类型有哪些
    eclipse中Build Path 导入的包和复制到 lib 包的区别
    马踏棋盘算法递归+回溯法实现 C语言
    微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
    Android_保存用户名和密码码sharedPreference
    Android---XML序列化
    直接拿来用!最火的Android开源项目
    异步http开源框架使用(AsyncHttpClient)
  • 原文地址:https://www.cnblogs.com/zuoshoushizi/p/8464175.html
Copyright © 2011-2022 走看看