创建型模式:抽象工厂(Abstract Factory)

意图:提供一个创建一系列相关或相互依赖对象(同个产品族的对象)的接口,而无需指定它
们具体的类。

结构:
abstract_method

示例:
abstract_method_example

AbstractFactory(WidgetFactory):声明一个创建抽象产品对象的接口,包括了创建同族产品的抽象方法。

class WidgetFactory(ABC):

    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            instance = super().__new__(cls, *args, **kwargs)
            cls.__instance = instance
        return cls.__instance

    @abstractmethod
    def create_scrollbar(self):
        pass

    @abstractmethod
    def create_window(self):
        pass

ConcreteFactory(PCWidgetFactory、PhoneWidgetFactory):实现创建同产品族具体产品对象方法的具体工厂,相应创建方法返回了具体的产品对象。

class PCWidgetFactory(WidgetFactory):

    def create_scrollbar(self):
        return PCScrollBar()

    def create_window(self):
        return PCWindow()


class PhoneWidgetFactory(WidgetFactory):

    def create_scrollbar(self):
        return PhoneScrollBar()

    def create_window(self):
        return PhoneWindow()

AbstractProduct(Window、ScrollBar):同类产品的抽象。

class Window(ABC):

    @abstractmethod
    def show(self):
        """打开窗口"""


class ScrollBar(ABC):

    @abstractmethod
    def scroll(self):
        """滚动"""

ConcreteProduct(PCWindow、PCScrollBar、PhoneWindow、PhoneScrollBar):由具体工厂创建的产品对象,实现了产品抽象接口。

class PCWindow(Window):

    def show(self):
        print('PC Window show.')


class PhoneWindow(Window):

    def show(self):
        print('Phone Window show.')


class PCScrollBar(ScrollBar):

    def scroll(self):
        print('PC ScrollBar scroll.')


class PhoneScrollBar(ScrollBar):

    def scroll(self):
        print('Phone ScrollBar scroll.')

Client:仅使用AbstractFactory和AbstractProduct的抽象接口。

print('pc')

# pc
pc_widget_factory = PCWidgetFactory()
pc_window = pc_widget_factory.create_window()
pc_scrollbar = pc_widget_factory.create_scrollbar()

# pc scroll in pc window
pc_window.show()
pc_scrollbar.scroll()

print('phone')

# phone
phone_widget_factory = PhoneWidgetFactory()
phone_window = phone_widget_factory.create_window()
phone_scrollbar = phone_widget_factory.create_scrollbar()

# phone scroll in phone window
phone_window.show()
phone_scrollbar.scroll()

分析:

  1. 为创建不同产品族的产品对象,应使用不同的具体工厂。(如还要创建一个Pad族组件的则需要创建具体Pad组件工厂)
  2. AbstractFactory产品对象的创建延迟到了具体子类ConcreteFactory上。
  3. 易于交换整个产品族:

    一个具体工厂类在一个应用中仅出现一次—即在它初始化
    的时候。这使得改变一个应用的具体工厂变得很容易。

    在例子中,只需要通过实例化不同的ConcreteFactory(PCWidgetFactory、PhoneWidgetFactory),就同从PC组件转换到Phone组件。

  4. 有利于产品的一致性:

    当一个系列中的产品对象被设计成一起工作时,一个应用一
    次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。

    如:在PCWidgetFactory产出的都是PC族的组件,在PC应用中这个族的组件需要一起工作(Phone亦然,不能混合)。

  5. 难以新增新类型的产品:AbstractFactory接口确定了可以被创建的产品集合(即同族的产品)。每次新增一个类型的产品(如Button),则需要扩展抽象工厂和具体工厂的接口,新增一个create_button()的方法,涉及了AbstractFactory和所有ConcreteFactory,有多少个具体工厂就要修改多少次。

  6. 利用参数来增加灵活性(为解决5.).

场景:同个应用在不同窗口系统上的组件不同。

E T + + [ W G M 8 8 ]使用Abstract Factory模式以达到在不同窗口系统(例如, X Wi n d o w s和
S u n Vi e w)间的可移植性。Wi n d o w S y s t e m抽象基类定义一些接口,来创建表示窗口系统资源
的对象(例如M a k e Wi n d o w、M a k e F o n t、M a k e C o l o r)。具体的子类为某个特定的窗口系统实
现这些接口。运行时刻, E T + +创建一个具体Wi n d o w S y s t e m子类的实例,以创建具体的系统资源对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值