在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品 地点: 湖南永州市蓝山县舜河村 作者:用心笑* Java设计模式-工厂模式(2)工厂方法模式 一、前言 1)概述: 2)角色结构: 3)类图关系: 二、代码实现 1)Coffce咖啡抽象类(产品抽象类 ) 2)AmericanCoffee 、LatteCoffee类(具体产品类) 3)CoffeeFactory(抽象工厂类) 4)AmericanCoffeeFactory、LatteCoffeeFactory 2)角色结构: 抽象工厂(Creator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
本文是这个系列的第二篇章,我们将讲解一下工厂模式的实现方式、应用场景以及它的用途。 工厂模式 工厂模式是一种创建型设计模式,其主要目标是封装对象的创建过程,使客户端代码与具体类的实例化解耦。 简单工厂模式 在简单工厂模式中,有一个单一的工厂类,该工厂类负责根据客户端的需求创建不同的产品对象。客户端通过向工厂类传递参数来获取所需的产品实例。 ("apple").produce(); SimpleFactory.createProduct("orange").produce(); 输出: 抽象工厂模式 在抽象工厂模式中,接口是负责创建一个相关对象的工厂 每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。 简单工厂模式适用于对象较少且变化不频繁的情况,而抽象工厂模式适用于需要支持多个产品族的情况。利用好工厂模式可以帮助你更好地组织和管理代码,提高代码的可扩展性和灵活性。
简介 工厂模式是在工作中第一次正式使用的(当然准确说是抽象工厂),所以作为第二篇的设计模式分享。 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。 注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。 有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
导言 为了克服简单工厂方法模式的缺点,人们试图改善工厂类的结构。 简单工厂方法模式与工厂方法模式的区别如下: 两个模式的中心不同。工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类(Concrete Factory Class)。 在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。 因此工厂方法模式支持开闭原则。 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。 在以下任何一种情况下,可以使用工厂方法模式。 工厂方法模式的优点如下: 工厂方法模式将创建对象的逻辑与任务交给了工厂类。 工厂方法模式支持开闭原则。
小谈设计模式(2)—简单工厂模式 专栏介绍 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过将对象的创建逻辑封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要向工厂类请求所需对象即可 简单工厂模式组成 在简单工厂模式中,主要涉及三个角色:抽象产品、具体产品和简单工厂。 抽象产品(Abstract Product) 抽象产品是具体产品类的共同接口,它定义了产品的通用方法。 2、具体产品是抽象产品的实现类,负责实现抽象产品中定义的方法。 3、简单工厂作为一个工厂类,封装了对象的创建过程。它根据客户端的请求创建相应的具体产品对象,并返回给客户端使用。 缺点 违反了开闭原则 在简单工厂模式中,当新增产品类型时,需要修改工厂类的代码。这违反了开闭原则,对于已经存在的代码进行修改可能会引入新的风险。因此,如果产品类型经常变化,不适合使用简单工厂模式。
分类 这里工厂模式分为2类:简单工厂 和 工厂方法,下一节会介绍第3类工厂模式:抽象工厂。 工厂方法 工厂方法模式是简单工厂的进一步优化,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂,也就是说每个对象都有一个与之对应的工厂。 定义 工厂方法模式又称为工厂模式,它的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中执行”。 通过上文可以知道,简单工厂在新增一款车的时候,需要修改简单工厂类 SimpleFactory,违背了设计模式中的**“开闭原则”**:对扩展开放,对修改封闭。 ,增加新的子类时,需要修改工厂类,违背了“开闭原则”,并且工厂类会变得越来越臃肿; 简单工厂模式适用于固定的,不会频繁新增子类的使用场景 工厂方法模式 通过在上层再增加一层抽象,提供了接口,每个子类都有自己的工厂类
什么是工厂方法模式 我们有一个产品类,还有一个工厂接口,一个实现工厂接口的工厂类。产品对象的创建是依靠工厂类来创建。核心就是创建与使用分离。 : 通过工厂可获取产品,不用知道产品的具体创建过程 如果新增产品,不需要修改工厂,只需要添加新的工厂即可 然而这也成了工厂模式的缺点,无疑增加了系统的复杂度。 关于工厂方法模式的一点思考 产品本身不实例化,而是交给工厂去做。工厂方法是一个类的实例化延迟到了工厂类。 我觉得使用工厂方法的一个重要好处就是屏蔽了产品类。 这里就用到了工厂方法模式。 当然如果增加了产品类,对于是否增加工厂类,需要慎重考虑。毕竟这会增加系统复杂度。 工厂方法模式可以用在异构项目中,例如通过WebService与一个非Java的项目交互,虽然WebService号称是可以做到异构系统的同构化,但是在实际的开发中,还是会碰到很多问题,如类型问题、WSDL
什么是工厂模式? 理解工厂2字 工厂就是生产东西给我们使用的,在Java的角度来讲就是在工厂里创建好了对象(return new Xxx()),我们只需要传参告诉工厂我们需要使用哪个对象,工厂即可帮我们完成创建并返回。 工厂模式满足OOP原则的: 开闭原则:对扩展开放,对修改关闭。 依赖倒置原则:面向接口编程,不要面向细节编程。 迪米特法则:间接通过朋友与朋友的朋友通信,不要直接与朋友的朋友通信。 2. 为什么需要工厂模式? 回顾接口: 接口的概念: Java种的接口是一种特殊的抽象类,跟一般的抽象类相比,接口里的所有方法都是抽象方法,接口里面所有属性都是常量。 【GoF 23】23种设计模式与OOP七大原则概述)。
工厂模式分三类:简单工厂模式、工厂方法模式、抽象工厂模式。 首先介绍比较简单一种工厂模式——简单工厂模式。 我们以计算器作为一个例子来说明工厂模式到底是什么。 我也同样不例外,为了提高自己的编程水平,所以一点点开始学设计模式。其实在很多开源代码里也有很多经典的设计模式,不懂设计模式,真的很难读懂源代码。 既然是工厂模式,那就有一个工厂类。 这个工厂类是用来干嘛的呢?工厂是用来做什么呢?生产东西用的,工厂模式的工厂类就使用类生产不同类不同对象的。 oper = OperationFactory.createOperation("+"); oper.setNumberA(1); oper.setNumberB(2) #到现在,就是简单工厂模式的思想,为什么不能几个if分支判断来实现计算器呢?那样岂不是代码量更少,好像更容易阅读么?
工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。 缺点 类的个数容易过多,增加复杂度 增加了系统的抽象性和理解难度 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。 工厂模式的应用场景 客户只知道创建产品的工厂名,而不知道具体的产品名。 客户不关心创建产品的细节,只关心产品的品牌 工厂模式的结构与实现 工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。本节来分析其基本结构和实现方法。 return new ConcreteProduct1(); } } //具体工厂2:生成具体产品2的生成方法 class ConcreteFactory2 implements
一般我们会说设计模式一共有23种,总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 今天主要是分析 简单工厂模式、工厂模式和抽象工厂模式的区别,所以这里就简单介绍一下设计模式的概念。 new_product2.show() 工厂方法模式优缺点 1.你可以避免创建者和具体产品之间的紧密耦合。 抽象工厂模式 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。是更多一重的工厂模式中。 = new_factory.crete_product2() new_product2.disp() 抽象工厂模式优缺点 1.你可以确保同一工厂生成的产品相互匹配。
简单工厂 用一个类来实例类 1.一个计算器的类有两个属性,为number1和number2 2.一个virtual方法用来得到结果 3.在工厂类中根据用户的操作符类型决定具体实例化哪个类 用例: { get => number2; set => number2 = value; } public virtual float GetResult() { break; } } return null; } } 工厂模式 工厂模式将用一个类来对一个类实例化,这些实例化的类继承一个抽象的实例化类。 这种模式避免了简单工厂中的switch、case的情况,在具体需要实例一个类的时候,调用某一个类就可以 让一个类的实例化延迟到其子类。
工厂模式的产生就是为了解决这种问题。 工厂模式厉害之处就在于:你不需要知道创建对象的细节就可以轻松的创建你想要的对象,并且产品和工厂是解耦的。 告诉工厂类,工厂类就创建什么类型的产品实例 2、工厂方法模式 1个抽象工厂类,多个具体工厂类,1个抽象产品类,多个具体产品类 每个工厂只能创建1个产品实例,当需要创建新产品的时候,需要扩展抽象工厂类,而不需要修改 工厂方法模式中,只有一个抽象产品类,每个工厂只能生产对应类型的产品实例 抽象工厂模式中,有多个抽象产品类,每个工厂可以生产多种类型的产品实例 总结 无论是哪种工厂模式,它们在形式和特点上都是相似的,他们的特点都是为了使产品和工厂解耦 在使用时不必在意具体是工厂方法模式还是抽象工厂模式,因为有时你会发现,明明使用的是工厂方法模式,当新需求来临,对代码稍加扩展或修改,加入一个新产品或方法后,由于产品构成了不同等级的产品族,就变成抽象工厂模式了 而在抽象工厂模式中,当减少一个产品或方法使得工厂提供的产品不再构成产品族后,它就演变成了工厂方法模式。 所以在使用工厂模式时,只需要关心是否降低了耦合度就ok了。
当年做一个项目时,还不懂什么是设计模式,仅仅是按照经验完成了需求。回头看看,就是暗合桥接模式。 如果当年我知道还有这样一种设计模式,或许,成品会更优秀。
回到正题。 * 这里是非标准逻辑下的数据处理
Endproc
Enddefine
如果当时知道工厂方法模式,也许有更完美的设计:
Public loForm As UI
m.loForm = CreateObject This.CreateDE("A")
Else
This.oDE = This.CreateDE("B")
EndIf
EndProc
***
目录 场景描叙: 1、简单工厂模式 1.1、静态工厂模式 1.2、 使用反射机制进行类注册的简单工厂模式 1.3、使用 newInstance 方法进行类注册的简单工厂模式 2、工厂方法模式 2.1、 我们可以增加一个新类来负责实例化 vehicle 对象,称之为简单工厂模式。 1、简单工厂模式 工厂模式用于实现逻辑的封装,并通过公共接口提供对象的实例化服务,在添加新类时只需要做少量修改即可。 这样就不需要修改就可以扩展工厂类。实现如 图2-1: 图2-1 2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。 它不再是创建单一类型的对象,而是创建一系列相关联的对象,如果说工厂方法模式中只包含一个抽象产品类,那么抽象工厂模式则包含多个抽象产品类。所以说工厂方法模式只是抽象工厂模式的一种特例。 ProductA2 和 ProductB2 来自第二个类簇,由 ConcreteFactory2 实例化。 结尾: 工厂的模式的核心就是右工厂类来负责合适对象的创建。
1.工厂方法模式定义 定义一个用于创建对象的接口,让子类决定具体实例话哪一个类。 2.通用实现方式 工厂方式通用实现方式类图如下: ? 其中Product定义了产品的共性,是对事物的抽象,Creator为抽象创建类,即抽象工厂,具体如何创建实例由实现类决定。 ()).newInstance(); } catch (Exception e) { } return (T)product; } } 对于工厂方法模式有许多扩展 ,其中之一就是当一个模块中只需要一个工厂的时候,其实可以对上面进行简化,直接将create方法定义为静态方法,相当于一个util类,代码如下: public class ConcreteCreator newInstance(); } catch (Exception e) { } return (T)product; } } 这种被称为简单工厂模式
工厂模式依据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经经常使用到的一种模式。 工厂方法模式: 通过工厂方法模式的类图能够看到,工厂方法模式有四个要素: 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。 由于没有工厂接口,所以在工厂实现的扩展性方面稍弱,能够算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。 适用场景: 无论是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。 假设使用工厂模式,就须要引入一个工厂类,会添加系统的复杂度。 其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。
一、简单工厂模式 常规设计:多个客户端对应一个创建产品类。一旦新增产品,每个客户端都需要修改,耦合性太高。 简 单工厂模式:客户与创建产品中添加一个工厂,创建对象都在工厂中,一旦新增产品,只需要修改工厂 二、工厂方法模式 抽象产品接口 具体产品类(实现抽象产品接口方法) 抽象工厂接口 具体工厂类(实现抽象产品接口及创建具体产品类 public void typeProduct() { System.out.println("I am SpecificProductOne"); } } //具体产品2 public IAbstractProduct createSpecificProduct() { return new SpecificProductOne(); } } //具体产品2的具体工厂 三、抽象工厂模式 //手机产品接口 interface IPhoneProduct{ //开机 void start(); //关机 void shutdown(); }
工厂方法模式,咋一看在这个计算器程序里好像反而使程序变得更加“复制”,确实代码量好像是增加了,到底有什么好处呢?我想多领会领会,必然有它存在的理由。 我们先来看看“简单工厂模式”和“工厂方法模式”的类继承关系。上篇提到的“简单工厂模式”的类继承关系如下图所示: ? “工厂方法模式”的类继承关系如下图所示: ? package day_2_factoryMethod; /** * 工厂类接口 * @author turbo * * 2016年8月31日 */ public interface IFactory ; System.out.println(oper.getResult()); } } 到现在,我们已经实现了工厂方法模式,至于这两种工厂模式有什么区别,各自的优缺点是什么 多结合简单工厂模式,思考,为什么存在这两种模式,各自的意义又是什么。
java工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例 简单工厂模式严重违背了“开闭原则”,难以拓展,由此产生了工厂方法模式。 工厂方法模式(FACTORY METHOD)是对简单工厂模式进行了抽象化,符合“开闭原则”,实现了可扩展。 工厂方法模式使用场景: 如组装手机的代工厂。从手机原料工厂获取外壳、显示屏、主板、按键、电池等配件进行组装。 很多介绍工厂方法模式的都是将工厂模式的用法列出来,而并没有具体介绍何时使用。