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()
    

      

  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/zcfx/p/11335966.html
Copyright © 2011-2022 走看看