设计模式之抽象工厂模式

概念

定义一个工厂类,让子类去创建一系列相关或相互依赖的对象

角色

抽象工厂角色
具体工厂角色
抽象产品角色
具体产品角色
客户端

优点

将客户端与类的实现相分离
每个工厂都创建了一个完整的产品系列
有利于产品的一致性

缺点

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

例子

生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,
其中每类对象都有不同的种类。
对每个具体工厂,分别生产一部手机需要三个对象。
相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品

代码示例

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""抽象工厂模式

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

角色:
    抽象产品角色
    具体产品角色
    抽象工厂角色
    具体工厂角色
    客户端

优点:
    将客户端与类的实现相分离
    每个工厂创建了一个完整的产品系列
    有利于产品的一致性

缺点:
    难以支持新种类的(抽象)产品
"""
from abc import ABCMeta
from abc import abstractmethod


# 抽象产品
class Shell(metaclass=ABCMeta):
    """抽象产品类:Shell"""

    @abstractmethod
    def show_shell(self):
        pass


class CPU(metaclass=ABCMeta):
    """抽象产品类:CPU"""

    @abstractmethod
    def show_cpu(self):
        pass


class OS(metaclass=ABCMeta):
    """抽象产品类:OS"""

    @abstractmethod
    def show_os(self):
        pass


# 具体产品
class LargeShell(Shell):
    """具体产品类:LargeShell"""

    def show_shell(self):
        print(format('大号手机壳', 's'))


class SmallShell(Shell):
    """具体产品类:SmallShell"""

    def show_shell(self):
        print(format('小号手机壳', 's'))


class AppleShell(Shell):
    """具体产品类:AppleShell"""

    def show_shell(self):
        print(format('苹果手机壳', 's'))


class Android(OS):
    """具体产品类:Android"""

    def show_os(self):
        print(format('安卓(Android)系统', 's'))


class IOS(OS):
    """具体产品类:ISO"""

    def show_os(self):
        print(format('苹果IOS系统', 's'))


class SnapDragonCPU(CPU):
    """具体产品类:SnapDragonCPU"""

    def show_cpu(self):
        print(format('骁龙CPU', ''))


class MediaTekCPU(CPU):
    """具体产品类:MediaTekCPU"""

    def show_cpu(self):
        print(format('联发科CPU'))


class AppleCPU(CPU):
    """具体产品类:AppleCPU"""

    def show_cpu(self):
        print(format('苹果CPU'))


# 抽象工厂
class PhoneFactory(metaclass=ABCMeta):
    """抽象工厂:PhoneFactory"""

    @abstractmethod
    def make_cpu(self):
        pass

    @abstractmethod
    def make_os(self):
        pass

    @abstractmethod
    def make_shell(self):
        pass


# 具体工厂
class MiFactory(PhoneFactory):
    """具体工厂:MiFactory"""

    def make_cpu(self):
        return SnapDragonCPU()

    def make_os(self):
        return Android()

    def make_shell(self):
        return LargeShell()


class HuaweiFactory(PhoneFactory):
    """具体工厂:HuaweiFactory"""

    def make_cpu(self):
        return MediaTekCPU()

    def make_os(self):
        return Android()

    def make_shell(self):
        return SmallShell()


class IPhoneFactory(PhoneFactory):
    """具体工厂:IPhoneFactory"""

    def make_cpu(self):
        return AppleCPU()

    def make_os(self):
        return IOS()

    def make_shell(self):
        return AppleShell()


# 客户端
class Phone(object):
    """客户端负责组装"""

    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)


phone1 = make_phone(IPhoneFactory())
phone1.show_info()

运行结果:
手机信息:
苹果CPU
苹果IOS系统
苹果手机壳

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值