《设计模式》工厂家族

设计模式被分成了三种类型,这次来说一下创建型中的工厂家族(简单工厂方法,工厂方法模式,抽象工厂)。通过了解,三者之间的比较来加深对工厂家族的了解。

简单工厂:

工厂类中有必要的逻辑判断,根据客户端的选择可以动态的实例化相关类.去除了与具体产品的依赖。

例:

在上述计算器的例子结构图中,如果我们要新加一个功能,不仅要增加预算类的子类,且还要修改运算类工厂,增加switch的case分之条件,这也就违背了开放封闭原则。

所谓的开放封闭原则:就是(软件实体类,模块,函数等)对扩展开放,修改封闭。

缺点:不符合开闭原则

工厂方法:

定义一个用于创建对象的接口,让子类决定实例化哪个类.使得一个类的实例化延迟到其子类。

例:

上图是计算器的工厂方法结构图,当需要增加新的功能的时候,只需要相应增加功能的运算类和工厂类,而不需要去修改原有的工厂类。

缺点:增加一个类,需要增加额外的开发量

优点:只有扩展变化,没有修改变化。克服了开闭原则。

简单工厂VS工厂方法:

工厂方法把简单工厂内部逻辑判断移到了客户端代码来进行.之前增加功能需要修改原有工厂类,现在只需修改客户端。

两者都是集中封装了对象的创建,使得更换对象不需要做大的改动就可实现,降低了耦合性。

抽象工厂:

提供创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类。

结构图:

缺点:若要增加新功能,就要增加三个类,还要修改原有类。

优点:符合开放封闭,依赖倒转原则。

易于交换产品系列;具体的创建实例过程和客户端分离,客户端是通过抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

每个模式都有自己的优缺点,如何解决所用模式的缺点呢,这里提到一个反射技术:

格式:Assembly.Load("程序集名称").createInstance("命名空间.类名称")

对于反射个人不是很理解,这里借用查到的资料来解释一下反射。  所谓反射就是根据编程语言提供的反射类,直接将字符串转化为类或方法,然后再进行调用。这样一来,在抽象工厂模式中,程序员在客户端代码中可以不知道具体的类名,通过反射来将输入或者获取到的字符串转化为抽象工厂模式中的工厂类,再调用同名方法实例化产品类,这样一来就可以完全避免使用逻辑判断了。

使用反射可以弥补抽象工厂的不足。

工厂方法VS抽象工厂:

抽象工厂模式改变了抽象工厂接口的结构。在工厂方法模式中,工厂类的方法只能实例化一种产品类;
但是在抽象工厂模式中,抽象工厂接口包含了多个抽象方法,这些方法可以实例化不同的产品类。

《设计模式》工厂家族

时间: 2024-09-29 03:10:57

《设计模式》工厂家族的相关文章

设计模式——工厂模式分析

设计模式--工厂模式分析 一.工厂模式优点 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.工厂模式根据抽象程度的不同分为三种:简单工厂模式(静态工厂模式).工厂方法模式.抽象工厂模式.工厂模式是编程中经常用到的一种模式,主要优点有: A.可以使代码结构清晰,有效地封装变化.在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品. B.对调

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

设计模式------工厂三姐妹

设计模式学完了,我是按照大话书上的顺序一个一个学习的,其中有三个模式名称中含有"工厂"这两个字眼,而且都属于创建型,它们就是"工厂三姐妹",下面我们通过计算器的示例来好好认识一下这姐妹三儿. 简单工厂模式: 简单工厂类中的代码: 从中我们可以看到,当用户请求进行加法运算时,只需operationFactory.createOperate("+"),工厂就会自动给出一个加法类的实例,用户根本不用和具体的运算类打交道,对象的创建过程被封装起来了.但是

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式---工厂模式---生产水果

设计模式---工厂模式 需要一个基本的抽象类:相当一个基本的工厂 需要若干个具体类:相当若干个产品 需要工具类:相当工厂中机器,用来选择不同的产品生产 需要主类:相当顾客所想的订单 主类 ----> 工厂类 ----> 产品类 ---> 产品具体类 老板根据顾客的订单,在工具堆中选择合适的,然后去工厂中生产适合的产品,返回给顾客 优势:能够在不修改原先的代码情况,增加所需的类与方法. 不足:会增多类文件的数量 接口:提供的内容,相当于协议,即外界使用此接口时,接口的内容是不允许外界对接口

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

设计模式——工厂方法

目的 定义创建对象的方法/接口,然后让子类来决定创建具体的类的对象. 通过不同的类,使得实例化延迟至子类. 特点 必须引入继承,才能算是工厂方法模式. Found in JDK API java.util.Calendar#getInstance()java.text.NumberFormat#getInstance() java.lang.StringBuffer, java.lang.StringBuilder(继承自 AbstractStringBuilder) 变种 工厂方法是抽象的:

设计模式-工厂方法(Demo)

工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他解决了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处可怜的眼神.罢了.再招几个女仆吧.话说还没给第一个女仆起名字.就叫'遥'吧.后来又招了'媛'和'悦'.然后让她们分别只做一道菜.遥做牛排.媛做红酒.悦做意大利面.这次每次我想吃牛排就直接跟遥说'吃饭',喝红酒就跟媛说'吃饭'而不用说吃什么了.因为她们每个人只做一道菜.以后要再想吃别的.就再招个女仆.

php设计模式 工厂、单例、注册树模式

Source Code Pro字体  easyphp 命名空间:隔离类和函数,php5.3以后 //test5.php<?php namespace Test5;//命名空间必须是程序脚本的第一条语句,除了declare function test(){ echo __FILE__; } //test6.php<?php namespace Test6; function test(){ echo __FILE__; } <?phprequire 'test5.php'; require