地点: 湖南永州市蓝山县舜河村 作者:用心笑* Java设计模式-工厂模式(2)工厂方法模式 一、前言 1)概述: 2)角色结构: 3)类图关系: 二、代码实现 1)Coffce咖啡抽象类(产品抽象类 ) 2)AmericanCoffee 、LatteCoffee类(具体产品类) 3)CoffeeFactory(抽象工厂类) 4)AmericanCoffeeFactory、LatteCoffeeFactory 工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。 工厂方法模式对简单工厂模式进行了抽象。 2)角色结构: 抽象工厂(Creator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
{ Console.WriteLine("I am a man"); Console.ReadKey(); } } (2) 那有没有什么方法可以屏蔽这种事情的发生呢(即被调用类的类名发生变化时,主调类稳定运行,不收影响) 可以采用面向抽象的编程方法,抽象:接口,抽象类 因此,将上面普通类的方法提取出来,定义一个接口让普通区继承并实现其中的方法 { Console.WriteLine("I am a Man"); Console.ReadKey(); } } (2) 故此使用工厂方法模式l:通过一个工厂,创建所需的对象 实现方式为: 首先,准备一个工厂类 该工厂类为: public class SimpleFactory { //通过方法创建对象 :高耦合 矛盾转移到工厂当中 简单工厂的弊端:修改普通类则工厂也需要修改 严重违背面向对象的单一原则(一个类只做一件事) 以上所需要的类型是在工厂中方法调用时指定的 第二部分:工厂方法进阶 第一种方式
什么是工厂方法? 工厂方法类似简单工厂,只不过将对象实例化延迟到了子类来实现。 工厂方法定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类。 2. 代码示例 定义一个创建对象的接口: // 创建对象的接口 public interface Product {...} 定义创建对象类,一般为抽象类,该类就是工厂方法 //工厂方法,用于创建对象,但是不直接在这里创建,而是延迟到子类创建 public abstract calss ProductCreator { // { protected Product factoryMethod(){ return new ProductImpl();//创建Product实例 } } 从代码可以看出,我们并没有在工厂方法中直接创建对象 工厂类只是定义了一些功能,并没有提供具体的实现,正好满足抽象类的条件,因而常常定义为一个抽象类。 3. 适用场景 工厂方法是站在设计原则的角度来设计的。
导致简单工厂方法模式不符合开闭原则的原因是工厂方法类只是一个实类,每当有一个新的产品类被加入到产品类的结构中时,在工厂方法类中就必须增加适当的条件语句,以便能够在合适的条件下创建新增加的类的实例。 简单工厂方法模式与工厂方法模式的区别如下: 两个模式的中心不同。工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类(Concrete Factory Class)。 在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。 因此工厂方法模式支持开闭原则。 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。 在以下任何一种情况下,可以使用工厂方法模式。 工厂方法模式的优点如下: 工厂方法模式将创建对象的逻辑与任务交给了工厂类。 工厂方法模式支持开闭原则。
什么是工厂方法模式 我们有一个产品类,还有一个工厂接口,一个实现工厂接口的工厂类。产品对象的创建是依靠工厂类来创建。核心就是创建与使用分离。 如果要实现抽象工厂,需要这么几个要素: 抽象工厂 具体工厂 抽象产品 具体产品 结构图如下: AbstractFactory就是抽象工厂,实际就是一个接口,里面有一个待实现的newProduct()方法 关于工厂方法模式的一点思考 产品本身不实例化,而是交给工厂去做。工厂方法是一个类的实例化延迟到了工厂类。 我觉得使用工厂方法的一个重要好处就是屏蔽了产品类。 这里就用到了工厂方法模式。 当然如果增加了产品类,对于是否增加工厂类,需要慎重考虑。毕竟这会增加系统复杂度。 在复杂的应用中一般采用多工厂的方法,然后再增加一个协调类,避免调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。
工厂模式分三类: 简单工厂 工厂方法 抽象工厂 简单工厂不属于设计模式,因为其违背了设计模式的开闭原则,后面会有介绍。 工厂方法 ? public AbstractFactory { public: Car * createCar() { return new Aodi(); }; }; 这是一个比较标准的工厂方法设计模式 简单工厂 ? factory_simple.png 这是工厂模式的简单实现方式,包含元素 工厂类 抽象产品 抽象方法 示例 这里抽象产品和抽象方法和前面一样。 比如:当需要生产法拉利时,我们需要修改工厂类的方法。这不符合开闭原则,所以它不属于设计模式。只是工厂模式的一个变相简单的实现。 抽象工厂 前面说到工厂方法只能生产一个类型的产品。 当我们需要生产一系列的产品,比如:我们需要奥迪的发动机,那么肯定也是在奥迪的工厂生产,那么这里就可以使用抽象工厂设计模式 元素 抽象工厂 具体工厂 抽象产品(多个) 具体产品 示例 这里我们再Car的基础上在增加一个产品
* 这里是非标准逻辑下的数据处理
Endproc
Enddefine
如果当时知道工厂方法模式,也许有更完美的设计:
Public loForm As UI
m.loForm = CreateObject ,子类必须实现该方法
***
Procedure Init()
EndProc
***
1.工厂方法模式定义 定义一个用于创建对象的接口,让子类决定具体实例话哪一个类。 2.通用实现方式 工厂方式通用实现方式类图如下: ? 其中Product定义了产品的共性,是对事物的抽象,Creator为抽象创建类,即抽象工厂,具体如何创建实例由实现类决定。 ()).newInstance(); } catch (Exception e) { } return (T)product; } } 对于工厂方法模式有许多扩展 ,其中之一就是当一个模块中只需要一个工厂的时候,其实可以对上面进行简化,直接将create方法定义为静态方法,相当于一个util类,代码如下: public class ConcreteCreator newInstance(); } catch (Exception e) { } return (T)product; } } 这种被称为简单工厂模式
工厂模式依据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经经常使用到的一种模式。 工厂方法模式: 通过工厂方法模式的类图能够看到,工厂方法模式有四个要素: 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。 前文提到的简单工厂模式跟工厂方法模式极为相似,差别是:简单工厂仅仅有三个要素,他没有工厂接口,而且得到产品的方法通常是静态的。 由于没有工厂接口,所以在工厂实现的扩展性方面稍弱,能够算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。 假如使用工厂方法的话,整个架构就显得清晰了很多。
工厂方法模式,咋一看在这个计算器程序里好像反而使程序变得更加“复制”,确实代码量好像是增加了,到底有什么好处呢?我想多领会领会,必然有它存在的理由。 我们先来看看“简单工厂模式”和“工厂方法模式”的类继承关系。上篇提到的“简单工厂模式”的类继承关系如下图所示: ? “工厂方法模式”的类继承关系如下图所示: ? package day_2_factoryMethod; /** * 工厂类接口 * @author turbo * * 2016年8月31日 */ public interface IFactory ; System.out.println(oper.getResult()); } } 到现在,我们已经实现了工厂方法模式,至于这两种工厂模式有什么区别,各自的优缺点是什么 ,我们在介绍了抽象工厂方法后再来做一个简单的总结。
本文主要对比一下简单工厂以及工厂方法在此情景需求下的实现方式。 一.简单工厂 概念:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 图一:简单工厂模式的UML 二.工厂方法 概念:核心工厂类不再负责产品的创建,成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。 图二:工厂方法模式的UML 通过对比我们可以发现: 1)简单工厂主要适合由工厂创造的“产品”(product)功能要求单一,而且区分界限明显【缺点:对工厂的方法开放‘修改’】 比如:计算器加减乘除运算仅返回一个 result(),由‘+、-、*、/’进行自动区分; 2)工厂方法适合工厂制造的product具有多功能,标准化工厂接口,具体产品由实现该接口的子工厂实现【缺点:将具体产品的生产“判断”抛出到了客户端,
文章目录 简单工厂 工厂方法 抽象工厂 简单工厂 ---- 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。 由于创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法模式(Static Factory Method)。 Factory表示工厂,工厂根据需要来创建相应的产品。 这样一来,当添加新的产品C时,只需要修改工厂部分代码即可,而传统方法需要在每一个创建产品的地方都进行修改。 ---- 不难发现当创建新的产品接口时,也需要对工厂方法修改,或创建多个工厂方法。 (比如增加魔法地块簇,对应组产品魔法公园、魔法空地、魔法监狱等) 抽象工厂将工厂方法进一步抽象。定义了一个接口用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”多系列具体对象创建工作“的紧耦合? command = command->ExecuteReader(); while(reader->Read()){ } } } 抽象工厂 class SqlCommand : public IDBCommand{ } class SqlDataReader : public IDataReader{ } //sql工厂 OracleCommand : public IDBCommand{ } class OracleDataReader : public IDataReader{ } //Oracle工厂 其缺点在于难以应对”新对象“的需求变动 笔记 抽象工厂就是在工厂模式的基础上创建多个对象 抽象工厂就是创建很多个对象 对象之间是一组一组的关系 不能这个对象用这个组里的 那个对象又用另外一个组里的 设计模式是解决稳定中有变换
假如我们现在有一个功能,使用Sqlserver保存User的数据,单一的方式比较简单,可以封装并在方法里实现与Sqlserver的连接,但是我们现在又增加了Access 同样保存User的数据,通过封装类的方法不能满足需要了 ,这个时候可以通过工厂方法来实现,如下图所示,创建IUser接口Sqlserver和Access分别去实现,并创建工厂接口类,Sqlserver和Access实现工厂类 每个实现类的职责都是单一,实现单一的对象 这种方式就是工厂方法。 ? 这个时候,我们不仅要要保存User的数据,还要保存Department的数据,此时,这个时候需要利用到抽象工厂方法,抽象工厂方法在工厂类里会实现不同的对象的,这是工厂方法不同的地方,工厂方法实现的是单一的对象 在抽象工厂方法里不仅要实现的createUser也要实现createDepartment,这就是抽象工厂方法 ?
工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式。 2 为什么要用该模式 在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。 抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。 工厂方法模式比起简单工厂模式更加符合开闭原则。 ,简单工厂模式简单好用,比工厂方法模式更加合适。
简 单工厂模式:客户与创建产品中添加一个工厂,创建对象都在工厂中,一旦新增产品,只需要修改工厂 二、工厂方法模式 抽象产品接口 具体产品类(实现抽象产品接口方法) 抽象工厂接口 具体工厂类(实现抽象产品接口及创建具体产品类 ) 中间件:聚合抽象工厂接口,接口调用具体工厂类方法创建具体产品 //抽象产品类 public interface IAbstractProduct { void typeProduct(); public void typeProduct() { System.out.println("I am SpecificProductOne"); } } //具体产品2 public IAbstractProduct createSpecificProduct() { return new SpecificProductOne(); } } //具体产品2的具体工厂 抽象产品类) ProductFactory productFactory = new ProductFactory(specificProductOne); //抽象产品类调用方法
比较: 简单工厂:定义一个工厂类,根据应用端传入的不同参数创建不同的业务实例。也可以理解为统一的静态方法工厂,该工厂类负责所有不同业务类型的封装。 工厂方法:将简单工厂进行优化,定义多种业务类,并定义每种业务相对应的工厂类,即不同的工厂类各自封装对应的业务,由应用端按需创建工厂及调用工厂封装的业务方法。 抽象工厂:将工厂方法进行抽象及优化,定义多种业务类,定义多个工厂类,工厂类可以封装多种业务类型,由应用端按需创建工厂及调用工厂封装的多种不同的业务类型。 代码分析: 简单工厂的代码 ? extends Phone { @Override void produce() { System.out.println("生产华为手机"); } } //简单工厂类 PhoneFactory(); Phone phone1=phoneFactory.getPhone("huawei"); phone1.produce(); } } 工厂方法的代码
一、概念 工厂方法模式:用来封装对象的创建。工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。 角色: 1、抽象工厂(Creator):定义了一个抽象的工厂方法,让子类实现此方法制造产品。 2、具体工厂(ConcreteCreator):实现抽象工厂方法,包含具体生产产品的实现代码,返回一个产品的实例。 ,并定义了一个抽象工厂方法。 将创建对象的代码集中在一个对象或方法中,可以避免代码的重复。 2、面向接口编程。
概述 工厂方法模式,英文Factory method pattern,工厂方法模式是简单工厂模式的进化版, 看本文之间最好先看一下简单工厂模式。 工厂方法模式是定义一个创建产品对象的工厂接口,工厂接口本身不去创建对象,而是交给其子类或者是其实现类去创建,将实际创建工作推迟到子类中进行,我们先看一下如何实现工厂方法模式,最后再说一下它有什么好处。 Operation operation = factory.createOperation(); operation.setNumA(1); operation.setNumB(2) 而简单工厂方法模式中增加一个运算类,需要在静态工厂方法中增加一个判断分支,这样看起来好像工厂方法模式反而麻烦了。现在就得引入软件设计中的一个原则,开放-封闭原则。 再来说简单工厂方法模式,我需要增加一种运算时,需要增加一个新的运算类,这没有错,但是还需要修改工厂方法,增加分支,这就违背了开放-封闭原则,工厂方法模式就是基于其上的遵循开放-封闭原则的解决方案,针对工厂的变化
工厂方法模式 工厂方法模式Factory Method Pattern又称为工厂模式,也叫虚拟构造器Virtual Constructor模式或者多态工厂Polymorphic Factory模式,它属于类创建型模式 模式分析 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。 优点 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。 工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。