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

      关于简单工厂模式、工厂方法模式、抽象工厂模式这三种设计模式网上有很多资料,这里不详细说明他们只给出定义.

      简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

      工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

      抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

      工厂就是用于生产产品(也就是创建实例),当我们只有一种产品时我们其实是不需要工厂的,只有在有多种类型的产品的时候才需要工厂来帮我们选择特定的类去实例化。一般的简单使用场景,简单工厂模式足以应付。当我们需要对一组产品同时初始化,并且每个产品都有多种类型的时候,就需要抽象工厂模式来应付了.这三者模式的抽象封装程度依次递增,可以认为抽象工厂模式就是返回了工厂的工厂模式.

      策略模式跟工厂模式有时候看起来很像,尤其是策略模式与简单工厂模式.

    先分别看看策略模式与简单工厂模式的代码:

      策略模式

    class Duck(object):
        def __init__(self, strategy=None):
            self.action = None
            if strategy:
                self.action = strategy()
    
        def fly(self, kind):
            if self.action:
                return self.action.fly(kind, self)
            else:
                raise UnboundLocalError('Exception raised, no strategyClass supplied to Duck!')
    
    class Duck1(object):
        def fly(self, kind, instance):
            return 'Duck1 fly kind: ' + kind + '#' + str(instance.count)
    
    class Duck2(object):
        def fly(self, kind, instance):
            return 'Duck2 fly kind: ' + kind + '#' + str(instance.count)
    
    if __name__ == '__main__':
        duckfly = Duck()
        duck1fly = Duck(strategy=Duck1)
        duck2fly = Duck(strategy=Duck2)
    
        try:
            print(duckfly.fly('yes'))
        except Exception as e:
            print("The following exception was expected:")
    
        print(duck1fly.fly('yes')) 
        print(duck1fly.fly('no'))
        print(duck1fly.fly('yes'))
        print(duck2fly.fly('yes'))
        print(duck2fly.fly('no'))

    简单工厂模式来实现上面的代码大致如下

    class Duck(object):
        def fly(self, kind):
            raise NotImplementedError()
    
    
    class Duck1(Duck):
        def fly(self, kind):
            return 'Duck1 fly kind: ' + kind 
    
    
    class Duck2(Duck):
        def fly(self, kind):
            return 'Duck2 fly kind: ' + kind 
    
    
    class DuckFactory(object):
    
        @staticmethod
        def create_duck(self, type):
            duckmap = dict(duck1=Duck1, duck2=Duck2)
            return duckmap[type]()
    
    if __name__ == '__main__':
        duck1fly = DuckFactory.create_duck('duck1')
        duck2fly = DuckFactory.create_duck('duck2')
    
        print(duck1fly.fly('yes'))
        print(duck1fly.fly('no'))
        print(duck2fly.fly('yes'))
        print(duck2fly.fly('no'))
    

      策略模式属于行为模式,策略模式中的算法是用来解决同一个问题的,根据时间、条件不同,算法的具体细节有差异,但最终解决的是同一个问题。在需求分析过程中,当听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式来处理这种变化的可能性。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

      很多时候策略模式会和工厂模式结合起来使用.

  • 相关阅读:
    14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp
    14.1 NFS介绍 14.2 NFS服务端安装配置 14.3 NFS配置选项
    13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复
    13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令
    12.21 php-fpm的pool 12.22 php-fpm慢执行日志 12.23 open_basedir 12.24 php-fpm进程管理
    12.17 Nginx负载均衡 12.18 ssl原理 12.19 生成ssl密钥对 12.20 Nginx配置ssl
    12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理
    在界面workspacebar上添加的OnContextMenu函数打的断点始终进不去,显示当前不会命中断点还未为文档加载任何符号
    VS2019安装闪退, 不出现安装界面,解决办法
    BCGP单元格多列合并需要注意的
  • 原文地址:https://www.cnblogs.com/ymy124/p/6419926.html
Copyright © 2011-2022 走看看