抽象工厂模式

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接口,其含有

常见的JAVA面试题

≡放荡痞女 提交于 2020-03-27 07:31:15
1.开发中都用到了那些设计模式?用在什么场合? 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。 2. 说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法 Session Facade Pattern:使用SessionBean访问EntityBean   Message Facade Pattern:实现异步调用   EJB Command Pattern:使用Command JavaBeans取代SessionBean,实现轻量级访问   Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性   Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性   Business Interface:通过远程(本地)接口和Bean类实现相同接口规范业务逻辑一致性   EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。 3.

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 */ //

设计者模式 --- 抽象工厂AbstractFactory

可紊 提交于 2020-03-25 20:26:33
工厂方法中只考虑生产同级别的产品,对于综合型的工厂,生产较多种类的产品无法使用,如下图,对于一个产品族,可能无法实现,这时需要使用抽象工厂。 首先看一下抽象工厂的定义:是一种为访问类创建一组相关或相互依赖对象的接口,并且访问类无需指定所需产品,具体类就能得到同族的不同等级的产品的模式结构。 相当于抽象工厂是工厂方法的升级版本,抽象工厂模式可以生产多个等级的产品。 使用抽象工厂模式一般需要满足以下条件: 系统中有多个产品族,每一个具体工厂创建同一族但是不同等级结构的产品 系统一次只可能消费其中某一族的产品,即同族的产品一起使用 抽象工厂模式主要优点: 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程; 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则; 系统中有多个可以在类的内部对产品族中相关联的多等级产品共同管理,而不必引入多个新的类来进行管理 缺点: 当产品族中增加一个新的产品时,所有的工厂多需要进行修改。 其结构: 抽象工厂(AbstractFactory):提供创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品 具体工厂(ConcreteFactory):实现抽象工厂中的多个抽象方法,完成具体产品的创建 抽象产品(Product):定义了产品的规范,描述厂品的主要特性以及功能

工厂方法、抽象工厂、简单工厂

北城余情 提交于 2020-03-24 11:01:46
昨天公司有同事分享了设计模式的一些内容,主要讲了简单工厂,抽象工厂,工厂方法的东西,讲的时候听得不是很明白,就像自己上网调查,并且写一篇博客加深自己的印象 抽象工厂:   抽象工厂是对应类这个概念的,也就是说一个类就是一个工厂。一个类里边可以有很多方法,这个是毋庸置疑的,而方法最多只能有一个返回值,假如这个类里边有三个方法,每个方法都一个返回值的话,那么对应抽象工厂来讲就是一个工厂里边有好多的产品线,每个产品线都可以生产一个产品,那么一个工厂就可以生产好多产品。   刚才讲的好像跟<抽象>没什么关系,那抽象是怎么体现出来的呢,类是怎么抽象的?提取一些事物的共同特征称其为抽象,像C#里边的接口,抽象类,都是抽象的概念,其实类也是一种抽象,对象才是真真正正具体的东西,就像我们讲<工厂> 他就是一个抽象概念,比如说小明家旁边有两家工厂,一个水泥厂,一个水果糖厂(这两个好像挨着不太好) 你可以说小明家旁边的<水泥厂>是<工厂>,但是你不能说<工厂>是小明家旁边的<水泥厂>,概念颠倒了,小明家旁边的的水果糖厂也是工厂啊。好还是用刚才的例子来举例,用这两种东西来举例有点难,但是咱们就硬着头皮上吧。比如说水泥厂要生产水泥有三种选择,A,B,C型水泥,对应不同的档次,同时呢水果糖厂也有三种选择,A,B,C型水果糖,对应不同的档次,现在我们要生产产品,但是这个水泥和水果糖找共同特征有点难

工厂方法模式

杀马特。学长 韩版系。学妹 提交于 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: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种不同的类型。如果日后需求不断增加,则后果不堪设想。   这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口