zoukankan      html  css  js  c++  java
  • 工厂方法模式

    这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂
    好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
    缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行
     
    示例代码:
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    '''
    Factory Method
    '''
    '''
    工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
    首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。   
    工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作
    由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产
    对应的产品。   
    工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Templete Method pattern)应用。
    ''' 
    class ShapeFactory(object):
        '''工厂类'''
     
        def getShape(self):
            return self.shape_name
     
    class Circle(ShapeFactory): 
        def __init__(self):
            self.shape_name = "Circle"
        def draw(self):
            print('draw circle')
     
    class Rectangle(ShapeFactory):
        def __init__(self):
            self.shape_name = "Retangle"
     
        def draw(self):
            print('draw Rectangle')
      
    class ShapeInterfaceFactory(object):
        '''接口基类'''
        def create(self):
            '''把要创建的工厂对象装配进来'''
            raise  NotImplementedError
     
    class ShapeCircle(ShapeInterfaceFactory):
        def create(self):
            return Circle()
     
    class ShapeRectangle(ShapeInterfaceFactory):
        def create(self):
            return Rectangle()
     
    shape_interface = ShapeCircle()
    obj = shape_interface.create()
    obj.getShape()
    obj.draw()
     
    shape_interface2 = ShapeRectangle()
    obj2 = shape_interface2.create()
    obj2.draw()
    执行结果:
    ShapeFactory(父类 or 基类):提取出所有子类的重复方法代码
    Circle(Shape子类 or 派生类):作用为画圆形
    Rectangle(Shape子类 or 派生类):作用为画矩形
    ShapeInterfaceFactory(父类 or 基类):提取出所有子类的重复方法代码
    ShapeCircle(ShapeInterfaceFactory的子类 or 派生类):作用为创建指定的Circle对象
    ShapeRectangle(ShapeInterfaceFactory的子类 or 派生类):作用为创建指定的Rectangle对象
     

  • 相关阅读:
    GCC编译错误小结
    Sword libcurl使用
    Python 包
    Python __all__系统变量
    Python 模块导入
    Python 异常处理
    Python 单例模式
    乐乐课堂_leleketang.com
    靠刷题考进了清华?学霸告诉你答案
    python logging配置时间或大小轮转
  • 原文地址:https://www.cnblogs.com/absoluteli/p/14124117.html
Copyright © 2011-2022 走看看