【通俗说设计模式】三、抽象工厂模式 & Python示例

专业介绍:

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

通俗介绍: 

它是工厂方法模式的升级版。工厂方法是一个具体工厂只生产一个种产品,如果要扩展产品,就必须扩展具体工厂。

但有时候我们需要一个工厂生产多种产品,这多种产品是属于一个产品族的,比如Wear工厂生产Clothes,Shoe,Pant等。这些都属于一个产品族(穿),但不同等级

引入两个新概念:

       产品族:由同一个工厂生产,但不同种类/结构。如某工厂生产不仅生产各种品牌的电视,还生产各种品牌的洗衣机。

       产品等级:在抽象工厂模式中,一个工厂内不同的方法生产不同等级的产品,如果电视和洗衣机可叫做不同等级。

 使用抽象工厂模式一般要满足以下条件:

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级的产品。
  • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:

  • 一个工厂类管理了不同等级的产品的创建
  • 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改(增加生产 "新不同等级产品" 的方法)。

抽象工厂拥有与工厂方法相同的四个角色:分别是抽象工厂、具体工厂、抽象产品、具体产品 。

代码:

# coding=utf-8

# 抽象工厂模式

import abc, six


# step-1: 创建抽象工厂
@six.add_metaclass(abc.ABCMeta)
class AbstractFactory:
    @abc.abstractmethod
    def produce_people(self, name):
        """生产人类"""
        pass

    @abc.abstractmethod
    def produce_ipad(self, version):
        """生产电子设备"""
        pass


# step-2: 创建抽象产品
@six.add_metaclass(abc.ABCMeta)
class AbstractPeople:
    @abc.abstractmethod
    def eat(self):
        pass


# step-2.1: 创建不同等级的抽象产品(但由同一工厂类管理)
@six.add_metaclass(abc.ABCMeta)
class AbstractElectronic:
    @abc.abstractmethod
    def display(self):
        pass

    @property
    @abc.abstractmethod
    def price(self):
        """价格是一个属性"""
        return 0


# step-3: 创建具体产品
class Chinese(AbstractPeople):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f'I am a Chinese,named {self.name}, I eat rice~')


# step-3.1: 创建不同等级的具体产品
class Ipad(AbstractElectronic):
    def __init__(self, version, price):
        self.v = version
        self._price = price

    def display(self):
        print(f'This is a sliver ipad-{self.v},price is {self.price}')

    @property
    def price(self):
        return self._price


# step-4: 创建具体工厂(这里仅一个工厂管理2种产品的创建)
class Factory(AbstractFactory):
    def produce_people(self, name):
        return Chinese(name)

    def produce_ipad(self, version):
        return Ipad(version, 6699)


if __name__ == '__main__':
    # 一个工厂创建不同等级的产品,当需要增加不同等级的产品时,需要修改所有的工厂类
    # 如果是增加新的产品族,就增加新的抽象产品,具体产品,具体工厂即可
    factory = Factory()

    ChineseA = factory.produce_people('A')
    ChineseA.eat()  # I am a Chinese,named A, I eat rice~

    Ipad4 = factory.produce_ipad(4)
    Ipad4.display()  # This is a sliver ipad-4,price is 6699

 

备注:关于abc, six库的基本用法参考文章 简单工厂模式 & Python示例 底部的介绍,: )

欢迎留言~

 

 

参考文章:

http://c.biancheng.net/view/1354.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值