zoukankan      html  css  js  c++  java
  • 设计模式-工厂模式(二)

    定义:

    工厂模式依然是一种创建型设计模式,作为工厂,它所关心的是产品的产生,也就是对象的创建,我们利用工厂来创建对象,而不必我们亲自创建对象,我们无需去理解如何创建对象,只需要向工厂提出要求,让工厂去根据你的要求,给你生产你要的产品,给你相应的对象,这种模式便叫做工厂模式。

    工厂模式的优点:

    1. 松耦合,创建的对象独立于类的实现
    2. 用户无需了解创建对象的类,仅需知道传递的接口,参数,方法。便可以创建所需的对象。
    3. 易于扩展。工厂添加其他的类的数据类型,仅需要修改参数即可。

    实现:

    「1」简单工厂模式:

    from abc import ABCMeta,abstractmethod
    #ABCMeta是python的一个元类,用于在Python程序中创建抽象基类,抽象基类中声明的抽象方法,使用abstractmethod装饰器装饰。
    class Coke(metaclass=ABCMeta):
        @abstractmethod
        def drink(self):
            pass
    
    class Coca(Coke):
        def drink(self):
            print('drink Coca-Cola')
    
    class Pepsi(Coke):
        def drink(self):
            print('drink Pepsi-Cola')
    
    class Fast_food_restaurant():
        def make_coke(self ,name):
            return eval(name)()
    
    KCD=Fast_food_restaurant()
    coke=KCD.make_coke('Coca')
    coke.drink()
    #drink Coca-Cola
    
    eval(类名)返回的是一个class类型的对象
    我们建立一个可乐的抽象类,百事可乐和可口可乐继承这个抽象类,我们又建立了快餐店类,也就是所说的工厂类,让它生产可乐。当用户需要可乐时,只需要告诉快餐店做一份什么品牌的可乐,告诉快餐店可乐的名字,然后快餐店使用make_coke方法做可乐,返回了你所需要的对象——一杯可口可乐,然后就可以快乐的喝可乐了。。
    View Code

    「2」工厂方法模式

    from abc import ABCMeta,abstractmethod
    
    class Coke(metaclass=ABCMeta):
        @abstractmethod
        def drink(self):
            pass
    
    class Coca(Coke):
        def drink(self):
            print('drink Coca-Cola')
    
    class Pepsi(Coke):
        def drink(self):
            print('drink Pepsi-Cola')
    
    class Sfencs(Coke):
        def drink(self):
            print('drink Sfencs-Cola')
    
    class Fast_food_restaurant(metaclass=ABCMeta):
        @abstractmethod
        def make_coke(self):
            pass
    
    class Coca_produce(Fast_food_restaurant):
        def make_coke(self):
            return Coca()
    
    class Pepsi_produce(Fast_food_restaurant):
        def make_coke(self):
            return Pepsi()
    
    class Sfencs_produce(Fast_food_restaurant):
        def make_coke(self):
            return Sfencs()
    
    KCD=Sfencs_produce()
    coke=KCD.make_coke()
    coke.drink()#drink Sfencs-Cola
    
    
    工厂方法模式将原来的工厂类变为了抽象类,不同类型的可乐通过不同的子类生产,也就是工厂方法模式定义了一个创建对象的接口,但具体创建哪个类的对象由子类来决定,这种方式的逻辑判断相当于交给了客户端,也就是KCD=Sfencs_produce()来选择使用哪个子类,这样如果有新可乐产品出现的话,只需要再写一个子类继承工厂抽象类。
    View Code

    「3」抽象工厂模式

    抽象工厂模式的主要目的是提供一个接口来创建一系列相关对象而无需指定具体的类。这个模式与工厂方法模式的区别在于,它的一个方法子类,可以创建一系列的对象。
    
    from abc import ABCMeta,abstractmethod
    
    class Ice_coke(metaclass=ABCMeta):
        @abstractmethod
        def drink(self):
            pass
    
    class Ordinary_coke(metaclass=ABCMeta):
        @abstractmethod
        def drink(self):
            pass
    
    class Coca_ice(Ice_coke):
        def drink(self):
            print('drink  Coca-ice-Cola')
    
    class Pepsi_ice(Ice_coke):
        def drink(self):
            print('drink Pepsi-ice-Cola')
    
    class Coca_ordinary(Ordinary_coke):
        def drink(self):
            print('drink Coca-ordinary-Cola')
    
    class Pepsi_ordinary(Ordinary_coke):
        def drink(self):
            print('drink Pepsi-ordinary-Cola')
    
    class Fast_food_restaurant(metaclass=ABCMeta):
        @abstractmethod
        def make_ice_coke(self):
            pass
    
        @abstractmethod
        def make_ordinary_coke(self):
            pass
    
    class Coca_produce(Fast_food_restaurant):
        def make_ice_coke(self):
            return Coca_ice()
        def make_ordinary_coke(self):
            return Coca_ordinary()
    
    class Pepsi_produce(Fast_food_restaurant):
        def make_ice_coke(self):
            return Pepsi_ice()
        def make_ordinary_coke(self):
            return Pepsi_ordinary()
    
    KCD=Coca_produce()
    coke=KCD.make_ice_coke()
    coke.drink()#drink  Coca-ice-Cola
    View Code
  • 相关阅读:
    hdu-6435
    Wannafly挑战赛22-A/B/C
    POJ-3041-建图/二分图匹配/网络流
    nyoj-1015-二分图判定
    hdu-6406-dp+ST表
    2017.3.27 集成modeler后的一些主要路径(持续更新)
    2016.3.23 集成新版activiti-modeler(5.17+)到项目中
    2017.3.14 activiti实战--第二十章--REST服务
    2017.2.28 activiti实战--第七章--Spring容器集成应用实例(五)普通表单
    2017.2.28 activiti实战--第六章--任务表单(二)外置表单
  • 原文地址:https://www.cnblogs.com/topass123/p/12705985.html
Copyright © 2011-2022 走看看