工厂方法模式

Spring中的设计模式:工厂方法模式

前提是你 提交于 2020-04-06 13:41:54
导读 工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向。 文章首发于微信公众号【码猿技术专栏】,原创不易,谢谢支持!!! 今天陈某分别从以下五个方面详细讲述一下工厂方法模式: 「从什么是工厂方法模式」 「通用框架实现」 「工厂方法模式的优点」 「工厂方法模式的升级」 「Spring底层如何使用工厂方法模式」 什么是工厂方法模式? 定义:定义一个用于创建对象的 接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法模式通用类图如下: 在工厂方法模式中,抽象产品 Product 负责定义产品的特性,实现对事物的抽象定义。 AbstractFactory 是抽象工厂类,定义了一个抽象工厂方法。具体的如何创建产品由工厂实现类 ConcreteFactory 完成。 通用框架实现 工厂方法模式的变种有很多,陈某给出一个比较实用的通用框架。 抽象产品类 : public abstract class Product { /** * 公共逻辑方法 */ public void method1(){} /** * 抽象方法:由子类实现,根据业务逻辑定义多个 */ public abstract void method2(); } 具体产品类1 ,继承抽象产品类

创建型模式:抽象工厂

混江龙づ霸主 提交于 2020-04-06 07:19:18
个人博客原文: 创建型模式:抽象工厂 五大创建型模式之三:抽象工厂。 简介 姓名 :抽象工厂 英文名 :Abstract Factory Pattern 价值观 :不管你有多少产品,给我就是了 个人介绍 : Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。 (来自《设计模式之禅》) 今天讲的是抽象工厂模式,小伙伴可能有疑问,抽象工厂和工厂方法之间都有工厂,那肯定是有什么联系的,具体是什么关系呢?简单的说:工厂方法是在解决一个产品多个层级方面的事情;而抽象工厂致力于解决多个产品多个层级方面的事情。举个例子:汽车是由很多零件组成的,比如引擎、轮胎、方向盘等等。现在如果我们是轮胎生产方,要生产宝马轮胎和奔驰轮胎,要用工厂方法还是抽象工厂实现呢?答案是:工厂方法。轮胎是一个产品,宝马轮胎和奔驰轮胎是 2 个不同层级的轮胎,所以用工厂方法解决就足够。假如现在我们是汽车生产方,要生产宝马汽车和奔驰汽车,汽车又包含轮胎和方向盘等等,要用哪个来实现?既然是上面的是工厂方法,那这个就用抽象工厂,因为这涉及到多个产品(轮胎、方向盘等等)和 2

设计模式——工厂方法模式

我的梦境 提交于 2020-04-04 00:00:11
目录 1. 简介 2. 示例1-计算器重构 2.1 背景说明 2.2 代码重构 2.3 程序类图 3. 示例2-模拟多功能日记记录器 3.1 背景说明 3.2 代码实现 3.3 程序类图 4. 总结分析 4.1 优点 4.2 缺点 4.3 适应场合 4.4 其他说明 5. 参考及源码下载 shanzm-2020年4月3日 22:26:27 1. 简介 工厂方法模式(Factory Method Pattern) 也称为 工厂模式 ,又称为虚拟构造器模式或多态模式。 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 工厂方法模式主要类: Product 抽象产品类(或是接口),派生出所有的具体产品类 ConcreteProductA 、 ConcreteProductA …… ConcreteProduct 具体产品类,继承于 Product 抽象类 Factory 抽象工厂接口,所有的具体工厂类都是实现该接口 ConcreteFactory 具体工厂,实现了 Factory 接口,创建具体的产品对象 注:在GoF的《设计模式:可复用面向对象软件的基础》,对工厂方法模式的描述中使用的是 Creator接口,其含有

PHP之设计模型分类(二)

倖福魔咒の 提交于 2020-03-26 21:26:30
3 月,跳不动了?>>> 创建型模式: 单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、创建者模式、原型模式。 1、单例模式 目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 应用场景:数据库连接、缓存操作、分布式存储。 <?php /** * * 单例模式 * */ class DbConn { private static $_instance = null; protected static $_counter = 0; protected $_db; //私有化构造函数,不允许外部创建实例 private function __construct() { self::$_counter += 1; } public function getInstance() { if (self::$_instance == null) { self::$_instance = new DbConn(); } return self::$_instance; } public function connect() { echo "connected: ".(self::$_counter)."n"; return $this->_db; } } /* * 不使用单例模式时,删除构造函数的private后再测试,第二次调用构造函数后,_counter变成2 */ //

工厂方法模式

杀马特。学长 韩版系。学妹 提交于 2020-03-24 10:58:55
    工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。   那么工厂方法模式是在什么场景下使用呢,下面就以本人的理解举例说明:相信很多人都做过导入导出功能,就拿导出功能来说。有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML、CSV、PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便核算或其他用途。如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。   这种进一步抽象化的结果

设计模式之工厂方法模式

感情迁移 提交于 2020-03-24 09:49:22
上一篇我们学习了简单工厂方法,在写例子的时候我就在想在,工厂类怎么要写这么多的判断 - - !而且每增加一个新的产品,就要修改工厂模式,增加新的判断。 这么做违反了我们设计模式中的开闭原则。 今天就来学习下可以帮助我们消除这些判断的工厂方法模式。 定义:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。 接着我们就上代码: 1 //首先是我们的抽象工厂类 2 package com.java.FactorMethod; 3 4 public interface MobileFactory { 5 public Mobile createMobile(); 6 } 7 8 //然后是抽象产品类 9 package com.java.FactorMethod; 10 11 public interface Mobile { 12 public void makeCall(); 13 } 这里我们要做的是一个手机工厂生产手机的例子。先定义一个抽象工厂接口,然后再定义一个抽象手机接口。接口都是定义了职责。 1 //苹果工厂 2 package

工厂方法模式

佐手、 提交于 2020-03-24 09:38:02
描述工厂方法模式:   工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。   工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 那么 工厂方法模式 是在什么场景下使用呢,下面就以本人的理解举例说明:   相信很多人都做过导入导出功能,就拿导出功能来说。有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML、CSV、PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便核算或其他用途。   如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。   这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。   这种进一步抽象化的结果

设计模式-工厂方法模式

梦想与她 提交于 2020-03-24 09:37:10
在阎宏博士的《JAVA与模式》一书中开头是这样描述工厂方法模式的:   工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。   工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 那么 工厂方法模式 是在什么场景下使用呢,下面就以本人的理解举例说明:( 内容转自此文章 )   相信很多人都做过导入导出功能,就拿导出功能来说。有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML、CSV、PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便核算或其他用途。   如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。   这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口

工厂方法模式

让人想犯罪 __ 提交于 2020-03-23 13:32:48
@ 目录 一、概述 二、模式结构图 三、模式中包含的角色及职责 四、具体代码实现 1、创建产品接口和工厂接口 2、创建具体产品 3、创建具体的产品工厂类 4、调用实现 五、简单工厂模式和工厂方法模式的比较 一、概述 工厂方法模式同样属于类的创建型模式,工厂方法模式是定义一个工厂接口,将实际创建工作推迟到子类当中。核心工厂不在负责产品对象的创建,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是可以是系统在不修改工厂角色的情况下引进新的产品。 二、模式结构图 三、模式中包含的角色及职责 组成(角色) 关系 作用 抽象产品(Product) 具体产品的父类 描述具体产品的公共接口 具体产品(Concrete Product) 抽象产品的子类;工厂类的目标类 描述生产的具体产品 抽象工厂(Factory) 具体工厂的父类 描述具体工厂的公共接口 具体工厂(Concrete Factory) 抽象工厂的子类;被外界调用 描述具体工厂FactoryMethod工厂方法创建产品的实例。 四、具体代码实现 1、创建产品接口和工厂接口 还是用水果工厂举例,首先我们需要水果接口和水果工厂接口来约束具体的水果类和水果工厂类; package 工厂方法模式; public interface Fruit { // 生产水果 public void get(); } package 工厂方法模式;

python-工厂方法模式

核能气质少年 提交于 2020-03-22 05:11:32
源码地址: https://github.com/weilanhanf/PythonDesignPatterns 简单工厂模式的不足: 在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。 说明: 工厂方法模式: 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。 工厂方法模式就是简单工厂模式的进一步抽像。由于面向对象多态性,工厂方法模式保持了简单工厂的有点同时克服了他的缺点。工厂方法模式中,核心的工厂被提升为一个抽象类,将具体的创建工作交给他的子类完成。这个抽象的工厂类仅规定具体工厂实现的接口,而不明确指出如何实例化一个产品类,这使得工厂方法模式允许系统在不修改原有产品结构的情况下轻松的引进新产品。 抽象工厂模式: 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式