zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    一、内容

    定义一个工厂类接口,当工厂子类来创建一系列相关或相互依赖的对象

    例:生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,其中每类对象都有不同的种类。对每个具体工厂,分别生产一部手机所需要的三个对象。

    二、角色

    • 抽象工厂角色(Creator
    • 具体工厂角色(Concrete Creator
    • 抽象产品角色(Product
    • 具体产品角色(Concrete Product
    • 客户端(Client

    相比工厂方法模式,抽象工厂模式中的每个具体工厂都产生一套产品

    三、优点

    • 将客户端与类的具体实现相分离
    • 每个工厂创建了一个完整的产品系列,使得易于交换产品系列
    • 有利于产品的一致性(即产品之间的约束关系)

    四、缺点

    • 难以支持新种类的(抽象)产品

    五、使用场景

    •  系统要独立于产品的创建与组合时

    •  强调一系列相关的产品对象的设计以便进行联合使用时 

    •  提供一个产品类库,想隐藏产品的具体实现时

    六、代码示例

    from abc import abstractmethod,ABCMeta
    
    #==============抽象产品============
    class PhoneShell(metaclass=ABCMeta):
        '''手机壳'''
        @abstractmethod
        def show_shell(self):
            pass
    
    class CPU(metaclass=ABCMeta):
        '''CPU'''
        @abstractmethod
        def show_cpu(self):
            pass
    
    class OS(metaclass=ABCMeta):
        '''操作系统'''
        @abstractmethod
        def show_os(self):
            pass
    
    
    # ===============抽象工厂==============
    class PhoneFactory(metaclass=ABCMeta):
        @abstractmethod
        def make_shell(self):
            '''制作手机壳'''
            pass
    
        @abstractmethod
        def make_cpu(self):
            '''制作cpu'''
            pass
    
        @abstractmethod
        def make_os(self):
            '''制作手机壳'''
            pass
    
    
    # =================具体产品==============
    class SmallShell(PhoneShell):
        def show_shell(self):
            print('普通手机小手机壳')
    
    class BigShell(PhoneShell):
        def show_shell(self):
            print('普通手机大手机壳')
    
    class AppleShell(PhoneShell):
        def show_shell(self):
            print('苹果手机壳')
    
    class YingTeerCPU(CPU):
        def show_cpu(self):
            print('英特尔cpu')
    
    class MediaCPU(CPU):
        def show_cpu(self):
            print('联发科cpu')
    
    class AppleCPU(CPU):
        def show_cpu(self):
            print('苹果cpu')
    
    class Android(OS):
        def show_os(self):
            print('Android系统')
    
    class IOS(OS):
        def show_os(self):
            print('ios系统')
    
    # ==============具体工厂================
    class MiFactory(PhoneFactory):
        def make_shell(self):
            return SmallShell()
    
        def make_cpu(self):
            return AppleCPU()
    
        def make_os(self):
            return Android()
    
    class HuaWeiactory(PhoneFactory):
        def make_shell(self):
            return BigShell()
    
        def make_cpu(self):
            return YingTeerCPU()
    
        def make_os(self):
            return Android()
    
    # ===============使用===============
    class Phone:
        def __init__(self,cpu,os,shell):
            self.cpu = cpu
            self.os = os
            self.shell = shell
    
        def show_info(self):
            print('手机信息')
            self.cpu.show_cpu()
            self.os.show_os()
            self.shell.show_shell()
    
    def make_phone(factory):
        cpu = factory.make_cpu()
        os = factory.make_os()
        shell = factory.make_shell()
        return Phone(cpu,os,shell)
    
    p1 = make_phone(HuaWeiactory())
    p1.show_info()
    
    p2 = make_phone(MiFactory())
    p2.show_info()
    

      

  • 相关阅读:
    CAN总线布线规范
    使用make_ext4fs时报错,No such file or directory
    安装arm-2009q3交叉编译器后,执行No such file....
    Busybox下make menconfig报错处理!
    解决Markdown转为PDF后,尖括号不能正确显示问题。
    开发板与PC直连 交叉、直连网线做法
    BusyBox tftp使用
    STM32的flash数据页转存过程分析!
    c语言中log函数的使用!
    POJ 3667 Hotel
  • 原文地址:https://www.cnblogs.com/zcfx/p/11335966.html
Copyright © 2011-2022 走看看