在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品 地点: 湖南永州市蓝山县舜河村 作者:用心笑* Java设计模式-工厂模式(2)工厂方法模式 一、前言 1)概述: 2)角色结构: 3)类图关系: 二、代码实现 1)Coffce咖啡抽象类(产品抽象类 ) 2)AmericanCoffee 、LatteCoffee类(具体产品类) 3)CoffeeFactory(抽象工厂类) 4)AmericanCoffeeFactory、LatteCoffeeFactory 2)角色结构: 抽象工厂(Creator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 abstract void addMilk(); public abstract void addSugar(); public abstract String getName(); } 2)
本文是这个系列的第二篇章,我们将讲解一下工厂模式的实现方式、应用场景以及它的用途。 工厂模式 工厂模式是一种创建型设计模式,其主要目标是封装对象的创建过程,使客户端代码与具体类的实例化解耦。 通过使用工厂模式,客户端无需直接调用具体类的构造函数,而是通过调用工厂方法或工厂接口来获取所需的对象。这提高了系统的灵活性,使得更容易更换或扩展产品对象。 具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品的对象。 工厂模式的优点包括: 封装了对象的创建过程,降低了客户端与具体类的耦合度。 简单工厂模式 在简单工厂模式中,有一个单一的工厂类,该工厂类负责根据客户端的需求创建不同的产品对象。客户端通过向工厂类传递参数来获取所需的产品实例。 每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。
什么是工厂模式? 理解工厂2字 工厂就是生产东西给我们使用的,在Java的角度来讲就是在工厂里创建好了对象(return new Xxx()),我们只需要传参告诉工厂我们需要使用哪个对象,工厂即可帮我们完成创建并返回。 工厂模式满足OOP原则的: 开闭原则:对扩展开放,对修改关闭。 依赖倒置原则:面向接口编程,不要面向细节编程。 迪米特法则:间接通过朋友与朋友的朋友通信,不要直接与朋友的朋友通信。 2. (int condition){ if(condition == 1){ return new ImplA();//创建实现类A的实例 }else if(condition == 2) (int condition){ if(condition == 1){ return new ImplA();//创建实现类A的实例 }else if(condition == 2)
{ Console.WriteLine("I am a man"); Console.ReadKey(); } } (2) { Console.WriteLine("I am a Man"); Console.ReadKey(); } } (2) 故此使用工厂方法模式l:通过一个工厂,创建所需的对象 实现方式为: 首先,准备一个工厂类 该工厂类为: public class SimpleFactory { //通过方法创建对象 :高耦合 矛盾转移到工厂当中 简单工厂的弊端:修改普通类则工厂也需要修改 严重违背面向对象的单一原则(一个类只做一件事) 以上所需要的类型是在工厂中方法调用时指定的 第二部分:工厂方法进阶 第一种方式 woman = SimpleFactory.CreateInstanceConfig();//方法无参数 woman.ShowS(); } 第二种方式:简单工厂
什么是工厂方法? 工厂方法类似简单工厂,只不过将对象实例化延迟到了子类来实现。 工厂方法定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类。 2. 代码示例 定义一个创建对象的接口: // 创建对象的接口 public interface Product {...} 定义创建对象类,一般为抽象类,该类就是工厂方法 //工厂方法,用于创建对象,但是不直接在这里创建,而是延迟到子类创建 public abstract calss ProductCreator { // 工厂类只是定义了一些功能,并没有提供具体的实现,正好满足抽象类的条件,因而常常定义为一个抽象类。 3. 适用场景 工厂方法是站在设计原则的角度来设计的。 (适用于架构师) 简单工厂是站在具体业务场景中设计的。(适用于编码者)
导言 为了克服简单工厂方法模式的缺点,人们试图改善工厂类的结构。 简单工厂方法模式与工厂方法模式的区别如下: 两个模式的中心不同。工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类(Concrete Factory Class)。 在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。 因此工厂方法模式支持开闭原则。 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。 在以下任何一种情况下,可以使用工厂方法模式。 工厂方法模式的优点如下: 工厂方法模式将创建对象的逻辑与任务交给了工厂类。 工厂方法模式支持开闭原则。
小谈设计模式(2)—简单工厂模式 专栏介绍 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过将对象的创建逻辑封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要向工厂类请求所需对象即可 在简单工厂模式中,每个具体产品都对应一个具体的产品类。 简单工厂(Simple Factory) 简单工厂是一个包含创建产品对象的静态方法的类。 2、具体产品是抽象产品的实现类,负责实现抽象产品中定义的方法。 3、简单工厂作为一个工厂类,封装了对象的创建过程。它根据客户端的请求创建相应的具体产品对象,并返回给客户端使用。 工厂类职责过重 在简单工厂模式中,工厂类负责创建所有的产品对象。随着产品类型的增多,工厂类的代码会变得越来越复杂,职责过重。这违反了单一职责原则,不利于代码的维护和扩展。
分类 这里工厂模式分为2类:简单工厂 和 工厂方法,下一节会介绍第3类工厂模式:抽象工厂。 所以,使用简单工厂,是将类的实例化交给工厂函数去做,对外提供统一的方法。 工厂方法 工厂方法模式是简单工厂的进一步优化,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂,也就是说每个对象都有一个与之对应的工厂。 工厂类,调用方法进行实例化 那么工厂方法增加了如此多的流程,提高了复杂度,究竟解决了简单工厂的什么问题呢? ,增加新的子类时,需要修改工厂类,违背了“开闭原则”,并且工厂类会变得越来越臃肿; 简单工厂模式适用于固定的,不会频繁新增子类的使用场景 工厂方法模式 通过在上层再增加一层抽象,提供了接口,每个子类都有自己的工厂类
什么是工厂方法模式 我们有一个产品类,还有一个工厂接口,一个实现工厂接口的工厂类。产品对象的创建是依靠工厂类来创建。核心就是创建与使用分离。 : 通过工厂可获取产品,不用知道产品的具体创建过程 如果新增产品,不需要修改工厂,只需要添加新的工厂即可 然而这也成了工厂模式的缺点,无疑增加了系统的复杂度。 如果要实现抽象工厂,需要这么几个要素: 抽象工厂 具体工厂 抽象产品 具体产品 结构图如下: AbstractFactory就是抽象工厂,实际就是一个接口,里面有一个待实现的newProduct()方法 关于工厂方法模式的一点思考 产品本身不实例化,而是交给工厂去做。工厂方法是一个类的实例化延迟到了工厂类。 我觉得使用工厂方法的一个重要好处就是屏蔽了产品类。 在复杂的应用中一般采用多工厂的方法,然后再增加一个协调类,避免调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。
工厂模式分三类: 简单工厂 工厂方法 抽象工厂 简单工厂不属于设计模式,因为其违背了设计模式的开闭原则,后面会有介绍。 工厂方法 ? 车可以生产车,那具体的奥迪车工厂可以生产奥迪车,奔驰车工厂可以生产奔驰的车。当需要生产法拉利的车时,我们只需要实现一个法拉利的产品,然后实现一个法拉利的工厂即可,而不需要修改之前的代码。 简单工厂 ? factory_simple.png 这是工厂模式的简单实现方式,包含元素 工厂类 抽象产品 抽象方法 示例 这里抽象产品和抽象方法和前面一样。 比如:当需要生产法拉利时,我们需要修改工厂类的方法。这不符合开闭原则,所以它不属于设计模式。只是工厂模式的一个变相简单的实现。 抽象工厂 前面说到工厂方法只能生产一个类型的产品。 当我们需要生产一系列的产品,比如:我们需要奥迪的发动机,那么肯定也是在奥迪的工厂生产,那么这里就可以使用抽象工厂设计模式 元素 抽象工厂 具体工厂 抽象产品(多个) 具体产品 示例 这里我们再Car的基础上在增加一个产品
* 这里是非标准逻辑下的数据处理
Endproc
Enddefine
如果当时知道工厂方法模式,也许有更完美的设计:
Public loForm As UI
m.loForm = CreateObject EndDefine
***
简介 工厂模式是在工作中第一次正式使用的(当然准确说是抽象工厂),所以作为第二篇的设计模式分享。 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。 应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 步骤 1 创建一个接口: Shape.java public interface Shape { void draw(); } 步骤 2 创建实现接口的实体类。
1.工厂方法模式定义 定义一个用于创建对象的接口,让子类决定具体实例话哪一个类。 2.通用实现方式 工厂方式通用实现方式类图如下: ? 其中Product定义了产品的共性,是对事物的抽象,Creator为抽象创建类,即抽象工厂,具体如何创建实例由实现类决定。 ()).newInstance(); } catch (Exception e) { } return (T)product; } } 对于工厂方法模式有许多扩展 ,其中之一就是当一个模块中只需要一个工厂的时候,其实可以对上面进行简化,直接将create方法定义为静态方法,相当于一个util类,代码如下: public class ConcreteCreator newInstance(); } catch (Exception e) { } return (T)product; } } 这种被称为简单工厂模式
工厂模式依据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经经常使用到的一种模式。 工厂方法模式: 通过工厂方法模式的类图能够看到,工厂方法模式有四个要素: 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。 前文提到的简单工厂模式跟工厂方法模式极为相似,差别是:简单工厂仅仅有三个要素,他没有工厂接口,而且得到产品的方法通常是静态的。 由于没有工厂接口,所以在工厂实现的扩展性方面稍弱,能够算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。 假设使用工厂模式,就须要引入一个工厂类,会添加系统的复杂度。 其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。
文章目录 简单工厂 工厂方法 抽象工厂 简单工厂 ---- 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。 Factory表示工厂,工厂根据需要来创建相应的产品。 这样一来,当添加新的产品C时,只需要修改工厂部分代码即可,而传统方法需要在每一个创建产品的地方都进行修改。 String []types=new String[3]; types[0]="Empty"; types[1]="park"; types[2] 可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。 把工厂类抽象后,对应不同子类工厂(普通/魔法),生产对应的一组产品。 new Map(); Scanner scan = new Scanner(System.in); System.out.println("请输入指令(1输出普通地图,2输出魔法地图
目录 场景描叙: 1、简单工厂模式 1.1、静态工厂模式 1.2、 使用反射机制进行类注册的简单工厂模式 1.3、使用 newInstance 方法进行类注册的简单工厂模式 2、工厂方法模式 2.1、 2)每个类应该只有一个发生变化的原因(单一职责原则); 而主类除了自身固有功能还要负责实例化 vehicle 对象,这种行为打破了单一职责原则。 所以这种情况下就需要一种更好的设计方案。 2)注册产品对象并向每个产品添加 newInstanse 方法,该方法返回与自身类型相同的新实例。 这样就不需要修改就可以扩展工厂类。实现如 图2-1: 图2-1 2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。 ProductA2 和 ProductB2 来自第二个类簇,由 ConcreteFactory2 实例化。 结尾: 工厂的模式的核心就是右工厂类来负责合适对象的创建。
1.简单工厂模式介绍 2.简单工厂模式举例 3.简单工厂模式的优劣 1.简单工厂模式介绍 工厂模式,比较常用,属于创建型模式,也就是主要是用来创建对象的。 工厂模式,有三种,主要分为: 简单工厂模式 工厂方法模式 抽象工厂模式 其中,本文要讲的就是,简单工厂模式,但是简单工厂模式,并不是属于GoF讲的23种设计模式中。简单工厂模式,也叫静态工厂方法模式。 简单而言,就是有一个具体的工厂类,用来生产不同类型的对象,而这些对象,都有相似的特点,它们都实现同一个接口。 什么时候应该使用工厂模式?为什么需要工厂模式呢? 2.简单工厂模式举例 假设现在有一个果园,用来种植各种水果,但是每一种水果种植的方式又不一样。 凡事都有优劣,简单工厂方法的缺点在于: 工厂类的重要性很高,一旦出现问题,影响所有的产品。 产品数量一旦特别多的时候,工厂内部逻辑会比较复杂,不利于理解和维护。 静态方法不利于继承和实现。
前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习。并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同。 2、更多的披萨店 现在我们要开更多的披萨店,例如美国风格披萨店(USSytlePizzaStore)、中国风格披萨店(CHNSytlePizzaStore)。 工厂方法模式:定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。 工厂方法与简单工厂的区别:工厂方法的子类看起来很像简单工厂。 利用抽象工厂我们代码将从实际工厂解耦,这样如果我们的工厂需要扩展那么我们则可在子类中进行修改扩展。 工厂方法与抽象工厂的异同优缺点 相同:都是用来创建对象。 不同:工厂方法使用的是继承,抽象工厂使用的是组合。 优点:工厂方法只负责从具体类型中解耦,抽象工厂适合将一群相关的产品集合起来。 缺点:抽象工厂扩展接口需要修改每个子类。
TOC 1.简单工厂模式介绍 工厂模式,比较常用,属于创建型模式,也就是主要是用来创建对象的。 工厂模式,有三种,主要分为: 简单工厂模式 工厂方法模式 抽象工厂模式 其中,本文要讲的就是,简单工厂模式,但是简单工厂模式,并不是属于GoF讲的23种设计模式中。简单工厂模式,也叫静态工厂方法模式。 简单而言,就是有一个具体的工厂类,用来生产不同类型的对象,而这些对象,都有相似的特点,它们都实现同一个接口。 什么时候应该使用工厂模式?为什么需要工厂模式呢? 2.简单工厂模式举例 假设现在有一个果园,用来种植各种水果,但是每一种水果种植的方式又不一样。 凡事都有优劣,简单工厂方法的缺点在于: 工厂类的重要性很高,一旦出现问题,影响所有的产品。 产品数量一旦特别多的时候,工厂内部逻辑会比较复杂,不利于理解和维护。 静态方法不利于继承和实现。
工厂模式分三类:简单工厂模式、工厂方法模式、抽象工厂模式。 首先介绍比较简单一种工厂模式——简单工厂模式。 我们以计算器作为一个例子来说明工厂模式到底是什么。 既然是工厂模式,那就有一个工厂类。这个工厂类是用来干嘛的呢?工厂是用来做什么呢?生产东西用的,工厂模式的工厂类就使用类生产不同类不同对象的。 oper = OperationFactory.createOperation("+"); oper.setNumberA(1); oper.setNumberB(2) ; System.out.println(oper.getResult()); } } 利用简单工厂模式,只需要输入运算符号,工厂类就能实例化出合适的对象,通过多态返回父类的方式的实现了计算器的结果 #到现在,就是简单工厂模式的思想,为什么不能几个if分支判断来实现计算器呢?那样岂不是代码量更少,好像更容易阅读么?