[Design Patterns] 01. Creational Patterns - Abstract Factory
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性。它是代码编制真正实现工程化。
四个关键元素:(1) Pattern Name, (2) Problem, (3) Solution, (4) Consequences.
一、相关资源
From: 史上最全设计模式导学目录(完整版)
Ref: 菜鸟教程之抽象工厂
六个创建型模式中的前三个。
111
简单工厂模式-Simple Factory Pattern【学习难度:★★☆☆☆,使用频率:★★★☆☆】
工厂三兄弟之简单工厂模式(一):图表库的设计
工厂三兄弟之简单工厂模式(二):简单工厂模式概述
工厂三兄弟之简单工厂模式(三):图表库的简单工厂模式解决方案
工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结
工厂方法模式-Factory Method Pattern【学习难度:★★☆☆☆,使用频率:★★★★★】
工厂三兄弟之工厂方法模式(一):日志记录器的设计
工厂三兄弟之工厂方法模式(二):工厂方法模式概述
工厂三兄弟之工厂方法模式(三):日志记录器的工厂方法模式解决方案,反射与配置文件
工厂三兄弟之工厂方法模式(四):重载的工厂方法,工厂方法的隐藏,工厂方法模式总结
抽象工厂模式-Abstract Factory Pattern【学习难度:★★★★☆,使用频率:★★★★★】
工厂三兄弟之抽象工厂模式(一):界面皮肤库的初始设计
工厂三兄弟之抽象工厂模式(二):产品等级结构与产品族
工厂三兄弟之抽象工厂模式(三):抽象工厂模式概述
工厂三兄弟之抽象工厂模式(四):界面皮肤库的抽象工厂模式解决方案
工厂三兄弟之抽象工厂模式(五):“开闭原则”的倾斜性,抽象工厂模式总结
222
资源链接
其中Abstract Factory Pattern 是重难点
一个工厂一般会生产一系列具有相关性的产品,即产品族。
在不同的工厂(大环境下)可能生产同一系列的产品族,具有相似的产品等级结构。
二、提出问题
客户的需求
首先,“连接数据库” 的过程应该对外是“屏蔽的“,都使用connect_to()。
接着,得到的工厂所包含的方法是统一的,都有parsed_data。
def main():
# 希望 connect_to 可以处理各种数据库文件,那就返回合适的工厂类,包含许多方法
xml_factory = connect_to('data/person.xml')
xml_data = xml_factory.parsed_data
liars = xml_data.findall(".//{}[{}='{}']".format('person','lastName', 'Liar'))
print('found: {} persons'.format(len(liars)))
for liar in liars:
print('first name: {}'.format(liar.find('firstName').text))
print('last name: {}'.format(liar.find('lastName').text))
[print('phone number ({})'.format(p.attrib['type']),
p.text) for p in liar.find('phoneNumbers')] print()
json_factory = connect_to('data/donut.json')
json_data = json_factory.parsed_data
print('found: {} donuts'.format(len(json_data)))
for donut in json_data:
print('name: {}'.format(donut['name']))
print('price: ${}'.format(donut['ppu']))
[print('topping: {} {}'.format(t['id'], t['type'])) for t in donut['topping']]
if else 实现的缺陷 - 简单工厂模式
connection_factory(filepath) 初始化了一个 ”特定的类“,并返回。
同时也就意味着:添加一个产品需要修改下面的函数,这不是很符合“开闭原则”。

Figure, 简单工厂模式
# factory:根据参数返回合适的工厂产品
def connection_factory(filepath):
if filepath.endswith('json'):
connector = JSONConnector
elif filepath.endswith('xml'):
connector = XMLConnector
else:
# 因为有“为保证安全”的connect_to层
raise ValueError('Cannot connect to {}'.format(filepath))
# 这里返回的已经是一个”实例”
return connector(filepath) def connect_to(filepath):
factory = None
try:
factory = connection_factory(filepath) # 简单模式下,只有一个工厂
except ValueError as ve:
print(ve)
return factory
多个工厂生产各自的产品

Figure, 工厂方法
三、类图符号
类图符号的学习,参考:类图
类名(Class):每个类都必须有一个名字,类名是一个字符串。
属性(Attributes):属性是指类的性质,即类的成员变量。类可以有任意多个属性,也可以没有属性。
操作(Operations):操作是类的任意一个实例对象都可以使用的行为,操作是类的成员方法。
关联关系 (Association)
将一个类的对象作为另一个类的属性。
单向关联

双向关联

多重性关联关系


聚合关系 (Aggregation) 和 组合关系 (Composition)
前者是弱关系;后者是强关系;
组合关系,表示整体与部分的关系。
但是与聚合不同此关系是整体与部分是同生共死关系,即如果整体对象销毁了部分也会被销毁。


依赖关系 (Dependency)
Driver是一个整体,Car也是整体,这不是整体与部分关系。
Driver中使用了Car的move方法,从而形成了“依赖关系”。

泛化关系 (Generalization)
继承(extends)关系,父类与子类关系。

实现关系 (Realization)
类实现(implements)了接口。当多个类有类似的行为方式的时候我们通常会使用接口。

四、抽象工厂
抽象工厂
首先,“游戏开始play” 的过程是对外“屏蔽的“。
接着,得到的工厂所包含的方法是统一的。
class GameEnvironment: def __init__(self, factory):
self.hero = factory.make_character()
self.obstacle = factory.make_obstacle() def play(self):
self.hero.interact_with(self.obstacle) # 建立好产品之间的关系 def main():
name = input("Hello. What's your name? ")
valid_input = False
while not valid_input:
valid_input, age = validate_age(name) game = FrogWorld if age < 18 else WizardWorld # <---- 工厂类。
environment = GameEnvironment(game(name)) # <---- 抽象工厂的"工厂"是"类";参数也是类!
environment.play()
与工厂方法的区别
Goto: 抽象工厂模式和工厂模式的区别?【三种枪的例子比较不错】
重要的两个问题:
- 增加一个新工厂,只要实现这个类即可。
- 增加一个新产品 ,只要为类添加新方法即可。
"抽象工厂"的工厂是类;"工厂方法"的工厂是方法。
抽象工厂的工厂类就做一件事情生产产品。生产的产品给客户端使用,绝不给自己用。
普通工厂产出是一个产品(实例),抽象工厂产出是一个抽象(接口)。
区别在于,若添加一个新的产品,前者是修改工厂,后者是创建新工厂(符合“闭合原则”)。
其实,抽象工厂多了一个“抽象的部分”从而间接调用“参数类(产品)”的方法。
End.
[Design Patterns] 01. Creational Patterns - Abstract Factory的更多相关文章
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- Design Patterns | 01 为什么要尽早掌握设计模式
标题:Design Patterns | 01 为什么要尽早掌握设计模式 链接: 标签:设计模式 摘要:设计模式是前人经验的总结,教大家如何写出可扩展.可读.可维护的高质量代码.设计模式与日常工作中的 ...
- 设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns)
目录 · 概述 · Factory · What is the Factory Design Pattern? · Sample Code · Abstract Factory · What is t ...
- 设计模式之美:Creational Patterns(创建型模式)
创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...
- Design Pattern ->Abstract Factory
Layering & Contract Philosophy With additional indirection Abstract Factory //The example code i ...
- Design Pattern ——Factory Method&Abstract Factory
今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factor ...
- Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】
I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ...
- .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变 ...
- 大白话抽象工厂模式(Abstract Factory Pattern)
实例分析 大白话工厂方法模式(Factory Method)一文中,我们讲解了日产4S店工厂规模的扩大,创建了针对不同车型的工厂,减少了工厂的工作内容,提高了效率.下面我们继续以4S店的故事讨论抽象工 ...
随机推荐
- Python爬虫运用正则表达式
我看到最近几部电影很火,查了一下猫眼电影上的数据,发现还有个榜单,里面有各种经典和热映电影的排行榜,然后我觉得电影封面图还挺好看的,想着一张一张下载真是费时费力,于是突发奇想,好像可以用一下最近学的东 ...
- idea使用springboot的webservice基于cxf
SpringBoot整合CXF实例: 服务端构建 <dependency> <groupId>org.apache.cxf</groupId> <artifa ...
- 如何实现QQ附件在线预览功能
方法一:使用 openoffice 的接口把文档转换成html (linux主机或者windows主机): 方法二:使用 一个叫 jacob.jar 的工具,在安装了 office 的windows主 ...
- k好数(动态规划)
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- 学习 Object-C: 简史
对于一门语言的历史,我认为写一本书可能都不为过,关键是看你如何介绍和表达.当然每一个人的理解也大相径庭.本文阐述也仅仅只是冰山一角,如果需要深入了解,自己可能需要多花费一些心思. 这里也不会给大家说太 ...
- ECMAScript---object对象类型详解
普通对象:由大括号包裹起来的,由零到多个属性名和属性值(键值对)组成的 那什么是属性呢? 属性:描述当前对象特征的,属性名是当前具备这个特征,属性值是这个特征的描述(专业语法,属性名称为键[key], ...
- C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)
NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发. 在WaveIn和WaveOut之外还有对 ...
- Java IO体系之File类浅析
Java IO体系之File类浅析 一.File类介绍 位于java.io下的Java File类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等.File对 ...
- 正则表达式-Regex详解
1.什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑.给定一个正 ...
- shell操作钉钉机器人实现告警提醒
我们知道,之前的运维告警多通过mail 等方式通知到相应的人员,难以实现随时随地的查看.随着手机APP的发展,很多告警开始发送到IM软件上去.目前比较常用的是发送到微信和钉钉上,今天我们将重点放在钉钉 ...