工厂方法模式

简单工厂模式、工厂方法模式以及抽象工厂模式(详解)

放肆的年华 提交于 2019-12-10 08:47:27
1.简单工厂模式 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,但它不属于 GOF,23 种设计模式(参考资料:http://c.biancheng.net/view/1317.html)。简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。 接下来我们来看代码,还是以课程为例,设有 Java 架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准 ICourse 接口: public interface ICourse { /** 录制视频 */ public void record ( ) ; } 创建一个 Java 课程的实现 JavaCourse 类: public class JavaCourse implements ICourse { public void record ( ) { System . out . println ( "录制 Java 课程" ) ; } } 客户端调用代码 public static void main ( String [ ] args ) { ICourse course = new JavaCourse ( ) ; course . record ( ) ; } 看上面的代码,父类

设计模式(Hibernate)

拈花ヽ惹草 提交于 2019-12-10 08:44:09
1、概述 2、面向对象设计原则 1)单一职责原则 2)开闭原则 3)里氏替换原则 4)依赖倒置原则 5)接口隔离原则 6)迪米特原则 7)组合/聚合复用原则 3、设计模式 4、设计模式分类 5、简单工厂模式 样例: 产品接口类(Product): package com.ljb.simplefactory; /** * 产品接口 * @author LJB * @version 2015年4月21日 */ public interface Product { /**产品生产工艺*/ public void craftwork(); /**产品特征*/ public void type(); } 产品类(鲜奶): package com.ljb.simplefactory; /** * 鲜奶 * @author LJB * @version 2015年4月21日 */ public class Creamery implements Product { @Override public void craftwork() { System.out.println("牛奶+除菌=鲜奶"); } @Override public void type() { System.out.println("原味浓香"); } } 产品类(酸奶): package com.ljb

小菜学设计模式——抽象工厂模式

北城余情 提交于 2019-12-09 13:48:00
背景 简单工厂、工厂方法模式,接着必须学习抽象工厂模式 1、使用意图 扩展工厂方法模式 2、生活实例 淘宝电影、猫眼电影都能为我们生成当天各种电影票 3、Java 例子(框架、JDK 、JEE) 个人觉得实实在在的根据抽象工厂模式定义的类应该会很少,毕竟不方便扩展,虽然它是一种很了不起的思想。一般都会采用反射机制+抽象工厂完成,比如,JDBC模块,在使用DriverManger.getConnection 这一步之前,必须要先加载驱动,也就是 Class.forname(class);这里指定class,通过这一步就可以创建驱动实例,也就是通过反射和工厂模式为应用注入了对象;Spring 核心之一 IoC 采用的也是反射机制+工厂模式来完成。 4、模式类图 5、模式优点 抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们的具体类。 最大的优点是:容易交换产品系列,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,他只需要改变具体工厂即可使用不同的产品配置。 其次,他让具体创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类别也被具体工厂实现分离,不出现在客户端代码中。 6、与类似模式比较 我们知道简单工厂模式(静态工厂模式)就是简单的把对象的创建过程移到了工厂当中

案例分析:设计模式与代码的结构特性

ⅰ亾dé卋堺 提交于 2019-12-08 14:57:29
一、抽象工厂模式 在介绍抽象工厂模式,我们先简单回顾一下简单工厂模式与工厂方法模式。 1.工厂模式:针对一个系列的类,它们有很多的共同点,因此可以将他们称为一个系列的产品,也就是一个系列的类。因此使用一个工厂,用一个工厂创建函数去创建某个具体的类。 实现流程如下: 系列类—>工厂—>创建函数—>某个具体的类 2.工厂方法模式:针对一系列的类,使用一个抽象的工厂接口,之后为每个具体的类都编写一个工厂类,随后在每一个类中使用创建函数创建具体类。 实现流程如下: 系列类——>抽象工厂接口—>多个与系列对应的工厂类—>每个类的创建函数—>某一个具体的类 回顾这些我们可以看出,简单工厂模式是笼统的承包服务,不管有多少个类需要创建,全部都由一个工厂去完成;而工厂函数模式则是定制化服务,每一个工厂只能创建某一种特定的类,但是这些工厂统一遵循即抽象工厂接口的创建方法。 抽象工厂模式即 是 “分类之后的一对一服务”,我们有多个系列的类需要创建,让某一个工厂专门负责某一类对象的创建,另一个工厂负责另外一类的对象创建。简单来说,简单工厂模式是集中式生产;工厂方法模式是分散式生产;而抽象工厂模式则是对于同一系列的集中式生产,而对于不同系列的分散式生产(结合前两者的优点)。 二、抽象工厂模式的使用情景 当出现一系列的产品族,且这些类比较容易划分时,设计模式可以采用使用抽象工厂模式。原因如下

小菜学设计模式——工厂方法模式

别来无恙 提交于 2019-12-07 21:03:24
背景 简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。如果,项目需要扩展,新增一种产品需要简单工厂模式生产,那么工厂内部必须重写修改必要的逻辑判断,这对于面向接口编码是非常不愿意看到的,因为他违背了面向对象设计原则:开放封闭原则。 那么如何我们才能解决这个问题呢?工厂方法模式的产生应该也是简单工厂模式的改进。 1、使用意图 工厂方法模式实现时,客户端需要决定实例化化哪一个工厂方法来生产产品,换句话说,工厂方法模式就是仅仅把简单工厂模式的内部必要逻辑判断移到了客户端代码来进行,那么,以前是修改工厂类内部的逻辑判断,现在变成了修改客户端的业务逻辑,说实话,相对于简单工厂模式稍微好点,但是还是难以扩展。 2、生活实例 生活处处是例子,只要有简单工厂模式的地方,自然可以调整为工厂方法模式。 3、Java 例子(框架、JDK 、JEE) 还是说以前那个报表导出的例子,工厂方法模式的话应该这样写,建一个超级工厂接口,IExportFactory,里面声明一个抽象方法,这个方法就是生产对象,估计你也知道了,生产的对象肯定是所有产品的超类,那么,如果你想要一个PdfExport实例的话,需要定义一个 PdfExportFactory 实现 IExportFactory ,同时实现里面的方法

案例分析:设计模式与代码的结构特性

梦想与她 提交于 2019-12-07 20:40:26
设计模式 – 工厂模式 工厂方法模式一种创建对象的模式,它被广泛应用在jdk中以及Spring和Struts框架中; 工厂方法模式基于"输入",应用在超类和多个子类之间的情况,这种模式将创建对象的责任转移到工厂类; 首先让我们学习一下如何在Java中应用工厂方法模式并且学习到工厂方法的优点,另外工厂方法模式也广泛应用在jdk中; 超类可以是接口、抽象类、父类,本例中将通过重写 toString() 方法来解释工厂方法模式; 工厂设计模式子类 假设子类 PC 和 Server 实现了 Computer: Server 也实现了 Computer: 工厂类 现在有了多个子类和超类,接下来可以创建工厂类了: 需要重点指出的是: 工厂类可以是单例的,getComputer 可以是静态的; getComputer 是工厂类的方法,且基于相同的参数类型返回了不同的对象; 接下来是一个简单的测试客户端程序,它使用上面的工厂设计模式实现。 输出: Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz 工厂设计模式的优点 面向接口编程,体现了面向对象的思想; 将创建对象的工作转移到了工厂类; JDK 中的工厂设计模式实例 java

【转载】设计模式也可以这么简单

烂漫一生 提交于 2019-12-07 18:54:29
一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的😂😂😂,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four ( GoF ) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 有一些重要的设计原则在开篇和大家分享下,这些原则将贯通全文: 面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧。 职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。 对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不能说改就改;对扩展开放就比较好理解了,也就是说在我们写好的代码基础上,很容易实现扩展。 创建型模式比较简单,但是会比较没有意思,结构型和行为型比较有意思。 创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类

案例分析:设计模式与代码的结构特性——工厂方法模式

◇◆丶佛笑我妖孽 提交于 2019-12-07 15:08:26
什么是工厂方法模式    工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。工厂方法(Factory Method)模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。   工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。 工厂方法模式的特点 工厂方法模式优点 (1)在工厂方法模式中,工厂方法用来创建客户所需要的产品

案例分析:设计模式与代码的结构特性

大兔子大兔子 提交于 2019-12-07 00:47:26
一、模式的定义与特点 1. 抽象工厂模式   抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,在软件开发中得以广泛应用,尤其是在一些框架和API类库的设计中,例如在Java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。抽象工厂模式也是在软件开发中最常用的设计模式之一。   抽象工厂(Abstract Factory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。   抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。   使用抽象工厂模式一般要满足以下条件:   (1)系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。   (2)系统一次只可能消费其中某一族产品,即同族的产品一起使用。 2.主要优点   抽象工厂模式的主要优点如下:   (1)抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。   

从BWM生产学习工厂模式

微笑、不失礼 提交于 2019-12-06 09:35:30
工厂模式应用非常之广,在 JDK 底层源码以及各大主流框架中随处可见,一般以 Factory 结尾命名的类,比如 Mybatis 中的 SqlSessionFactory , Spring 中的 BeanFactory 等,都是工厂模式的典型代表。 一、简单工厂模式 1.1 概念 简单工厂模式又称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例,目的是实现类与类之间解耦:客户端不需要知道这个对象是如何被穿创建出来的,只需要调用简单工厂模式的方法来统一创建就可以了,从而明确了各个类的职责。 1.2 示例 简单工厂模式,以生产汽车轮胎为例。 1.2.1 实体类 轮胎通用属性 public class Tire { /** * 通用属性 */ private String common; } 奔驰车轮胎 包含通用属性外还有自己的特有属性 public class TireForBenz extends Tire{ Tire tire; /** * 特有属性 */ private String benz; public TireForBenz() { this.benz = "得到 Benz 轮胎"; } @Override public String toString() { return "["+this.benz +"]"; } }