创建型模式:抽象工厂(Abstract Factory)
来源:互联网 发布:中世纪2全面战争优化9 编辑:程序博客网 时间:2024/05/19 06:18
意图:提供一个创建一系列相关或相互依赖对象(同个产品族的对象)的接口,而无需指定它
们具体的类。
结构:
示例:
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')# pcpc_widget_factory = PCWidgetFactory()pc_window = pc_widget_factory.create_window()pc_scrollbar = pc_widget_factory.create_scrollbar()# pc scroll in pc windowpc_window.show()pc_scrollbar.scroll()print('phone')# phonephone_widget_factory = PhoneWidgetFactory()phone_window = phone_widget_factory.create_window()phone_scrollbar = phone_widget_factory.create_scrollbar()# phone scroll in phone windowphone_window.show()phone_scrollbar.scroll()
分析:
- 为创建不同产品族的产品对象,应使用不同的具体工厂。(如还要创建一个Pad族组件的则需要创建具体Pad组件工厂)
- AbstractFactory产品对象的创建延迟到了具体子类ConcreteFactory上。
易于交换整个产品族:
一个具体工厂类在一个应用中仅出现一次—即在它初始化
的时候。这使得改变一个应用的具体工厂变得很容易。在例子中,只需要通过实例化不同的ConcreteFactory(PCWidgetFactory、PhoneWidgetFactory),就同从PC组件转换到Phone组件。
有利于产品的一致性:
当一个系列中的产品对象被设计成一起工作时,一个应用一
次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。如:在PCWidgetFactory产出的都是PC族的组件,在PC应用中这个族的组件需要一起工作(Phone亦然,不能混合)。
难以新增新类型的产品:AbstractFactory接口确定了可以被创建的产品集合(即同族的产品)。每次新增一个类型的产品(如Button),则需要扩展抽象工厂和具体工厂的接口,新增一个create_button()的方法,涉及了AbstractFactory和所有ConcreteFactory,有多少个具体工厂就要修改多少次。
利用参数来增加灵活性(为解决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子类的实例,以创建具体的系统资源对象。
- Abstract Factory抽象工厂(创建型模式)
- 创建型模式 ABSTRACT FACTORY---抽象工厂
- Abstract Factory 抽象工厂(创建型模式)
- 【创建型模式】abstract factory(抽象工厂)
- 【创建型模式】abstract factory(抽象工厂)
- 创建型-抽象工厂模式(abstract factory)
- 2. 抽象工厂模式(Abstract Factory) ---------- 创建型模式
- 创建型模式2:抽象工厂模式(Abstract Factory)
- 创建型模式:抽象工厂模式(Abstract Factory Pattern)
- 设计模式-创建型-抽象工厂模式(Abstract Factory)
- Abstract Factory模式(抽象工厂模式 创建型)
- Abstract Factory 抽象工厂(创建型模式)
- 3. Abstract Factory 抽象工厂(创建型模式)
- 笔记3:Abstract Factory 抽象工厂(创建型模式)
- 创建型模式:Abstract Factory(抽象工厂)
- ABSTRACT FACTORY(抽象工厂)—对象创建型模式
- abstract factory(抽象工厂) 对象创建型模式
- Abstract Factory(抽象工厂)--对象创建型模式
- windows server2014 安装 Mysql Applying Security出错
- Linux常见命令——(三)
- 关于注解的文章
- 边界跟踪算法(一)——Square跟踪算法
- cf 782b
- 创建型模式:抽象工厂(Abstract Factory)
- 数据库引擎浅识
- Android-环境搭建
- Vue $set 数组不能更新视图的问题
- 省市联动的实现
- EventBus分析--事件的注册
- LeetCode--Add Two Numbers
- centos7下nginx的基本配置
- Win/Lin 双系统时间错误的调整