原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂方法模式>中提到,在工厂方法模式中一种工厂只能创建一种具体产品.而在抽象工厂模式中一种具体工厂可以创建多个种类的具体产品. 抽象工厂模式 抽象工厂模式介绍 抽象工厂模式(Factory Method Pattern)中,抽象工厂提供一系列创建多个抽象产品的接口,而具体的工厂负责实现具体的产品实例.抽象工…
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖,不能应对“具体实例化类型”的变化    解决思路:    -封装变化点——那里变化,封装那里    -潜台词:如果没有变化,当然不需要额外的封装    工厂模式的缘起    变化点在“对象创建”,因此就封装“对象创建”    面向接口编程——依赖接口,而非依赖实现    最简单的解决方法:    …
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同属于同一个产品族的产品可以使用. 产品族:位于不同产品等级结构中,功能相关联的产品组成的家族.下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族. 二.类图 三.案例 产品类 // 汽车(抽象产品接口) interfa…
博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来.这次主要分享一下在架构设计过程中涉及的基础知识,主要是涵盖系统架构方法.架构模式及设计模式,便于大家在后续一起探讨HRMS系统的SaaS模式的架构设计. 一.设计模式 大家或多或少的都接触并在实际的开发过程中无形中可能都使用了某种设计模式,可能我们并不知道具体的模式叫什么名字,现在讲设计模式的书.案例分享都…
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象. 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML图解 AbstractFactory:声明一个创建抽象产品对象的操作接口 ConcreteFact…
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该怎么来重构?似乎,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是本次将要学习的抽象工厂模式的基本思想. 抽象工厂模式(Abstract Factory) 学习难度:★★★★☆ 使用频率:★★★★★ 一.界面皮肤库的初始设计 M公司IT开发部接到一个开发任务,想要对以前…
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该怎么来重构?似乎,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是本次将要学习的抽象工厂模式的基本思想. 抽象工厂模式(Abstract Factory) 学习难度:★★★★☆ 使用频率:★★★★★ 一.界面皮肤库的初始设计 M公司IT开发部接到一个开发任务,想要对以前…
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题, 但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销. 此时,我们可以考虑将一些相关的产品组成一个"产品族",由同一个工厂来统一生产.这就是抽象工厂模式的基本思想. 2. 模拟业务 开发一套界面皮肤库,用户在使用时可以通过菜单来选择皮肤…
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同属于同一个产品族的产品可以使用. 产品族:位于不同产品等级结构中,功能相关联的产品组成的家族.下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族. 二.类图 三.抽象工厂模式的组成 抽象工厂(AbstractFacto…
一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容. 二.抽象工厂详细介绍 这…
定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂…
抽象工厂模式主要有以下角色: 抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的.通常使用接口或抽象类实现.    具体工厂角色:这个角色直接在客户端的调用下创建产品的实例.这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的.通常使用具体的类实现.    抽象产品角色:担任这个角色的类是抽象工厂方法模式所创建的对象的父类,或它们共同拥有的接口.通常使用接口或抽象类实现这一角色.    具体产品角色:抽象工厂模式所创建的任何产品对象都是某…
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另…
一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性原则.例如,如果需要增加Word文件的数据采集,此时按以下步骤操作: 创建Word文件数据采集类,实现仪器数据采集接口: 修改仪器数据采集工厂类,增加Word文件数据采集类的工厂方法: 调用工厂类的word文件方法: 步骤2修改了工厂类,如果每增加一实现类都需要修改工厂类,那么这样就不合理了. 解决办法是使用…
前面分析了简单工厂模式和工厂方法模式,接着来看一下抽象工厂模式,他与工厂方法模式有一些相似的地方,也有不同的地方. 先来看一个不用工厂方法模式实现的订购披萨的代码: 对象依赖的问题:当你直接实例化一个对象时,就是在依赖他的具体类.接着上面的例子,如果在一个PizzaStore里面直接创建很多对象时,他们的依赖关系是这样的: 这里引出一个概念:依赖倒置.很清楚的代码里减少具体类的依赖是一件好事.依赖倒置的定义是:要依赖抽象,不要依赖实现.这个原则说说明了:不能让高层组建依赖底层组件,而且,不管是高…
学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难.就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便.抽象工厂模式名字听起来抽象.但理解起来一点也不抽象,用语言可能不好理解.我喜欢通过代码理解.然后成为自己的东西. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类. <<大话设计模式>>以项目上线时想换另外一个数据库为样例展开的,假如我没原来用的是SqlServer,如今换成access,代码例如以下: 1.訪…
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品.换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品. 应用场景 客户端不需要知道它所创建的对象的类. 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况. 系统结构稳定,不会频繁地增加…
提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.例如某些系统可能需要为用户提供一系列相关对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否则用户不仅要清楚知道哪些类来创建对象,而且必须要清楚这些对象之间是如何相关的,使得用户代码和这些类型形成耦合,不利维护,一般会包括以下四种角色: 抽象产品(Product):一个抽象类或接口,负责定义具体产品必须实现的方法: 具体产品(ConcreteProduct):具体产品是一个类,如果Prod…
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工厂优点 a 应用层代码不和具体的产品发生依赖,只和具体的产品族工厂发生依赖关系,低耦合,高内聚. b 从具体的产品工厂取出来的肯定是同一产品族,开发的时候逻辑清晰.(ab其实可以归为1点) c 对于产品族来说,符合开闭原则,增加新的产品族的时候,对扩展开放 1.2 抽象工厂缺点 a 增加新的产品时候…
抽象工厂,名字就告诉你是抽象的了.上代码. public interface BMW { public void Drive(); } public class BMW730 : BMW { public override void Drive() { Console.WriteLine("BMW 730 Run"); } } public class BMWX6 : BMW { public override void Drive() { Console.WriteLine(&quo…
抽象工厂模式 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML类图: 场景:抽象村商店想销售Pizza和Hamburg等多种商品,而在美国店和中国店要出售本土化的口味 工厂接口定声明了要创建的产品接口 interface Factory { AbstractHamburg createHamburg(); AbstractPizza createPizza(); } 具体的工厂创建具体产品 class USAFactory : Factory { public…
简单工厂模式和工厂模式 要求 同类型的产品子类有共同的方法.这限制了产品子类的扩展.抽象工厂能client它提供了一个接口,它是client而不必指定产品的详细信息.创建多个产品系列产品对象.在归为一类相同的子类的产品抽象工厂类.让他们继承相同的抽象子类.子类视为一组.产品族是指位于不同产品等级结构中,功能相关联的产品组成的家族. 一般位于不同等级结构的同样位置上.每个产品族中的产品数量与产品等级结构的数量同样.用户通过工厂以及族来推断 当用户使用时,必须知道哪个工厂以及哪个产品族的产品类,即通…
1.抽象工厂模式介绍 上一篇我们了解了工厂模式,知道工厂模式可以解决简单工厂的缺陷(简单工厂添加新产品时要修改工厂类,不符合开闭原则),但是简单工厂和工厂模式都是只生产一种产品(前边的简单工厂和工厂都只生产鼠标),实际上戴尔和惠普公司不仅生产鼠标还生产键盘,为了解决系列产品的问题,就有了抽象工厂模式.我们就以生产鼠标和键盘为例来理解抽象工厂. 产品类,包括鼠标类和键盘类: //鼠标抽象类 public abstract class Mouse { public abstract void Pri…
为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类. 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机.海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中. 抽象工厂模式包含如…
抽象工厂模式 用来生产不同产品族的全部产品.(对于增加新的产品,无能为力:支持增加产品族) 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种.业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式. Engine.java public interface Engine { void run(); void start(); } class LuxuryEngine implements Engine{ @Override public void run() { System.o…
上一篇咱们做好了准备工作.数据库设计和Entity层,如今介绍 4.反射+抽象工厂 反射:用来消除Switch和if的,这里我尽量简单地介绍,以便大家理解.反射其有用起来非常easy.你就觉得他就是决定:去某个地方找应该要实例化的类是哪个.怎么理解? '************************** '文 件 名:DataAccess '命名空间:Factory '内 容: '功 能: '文件关系: '作 者:邱慕夏 '小 组:邱慕夏 '生成日期:2014-06-09 9:17:51 '版…
抽象工厂模式: 提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型. Provide an interface for creating families of related or dependent objects without specifying their concrete classes. UML类图: 主要包含: AbstractFactory(ContinentFactory):抽象的工厂类.为详细的工厂类声明了一系列的接口. ConcreteFacto…
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构. 抽象工厂模式使用同一个 工厂等级结构负责这些不同产品等级结构产品对象的创建. 所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象. 注意: 如果不存在”多系列对象创建“的需求变化,则没必要应用Abstract Factory模式,静态工厂方法足矣. "系列对象"指的是这些对象之间有相互依赖.…
我们接着上一章的工厂方法模式继续学习一下抽象工厂模式. 抽象工厂模式:在工厂模式中,如果有多个产品,则就是抽象工厂模式. 例子: 有一个工厂开了两个子公司,专门用来生产电脑配件键盘和鼠标,一个是联想工厂则生产联想的产品,另一个是宏碁工厂则生产宏碁的产品. 代码如下: 1.工厂接口(可以生产鼠标和键盘) public interface Factory { // 生产鼠标 Mouse createMouse(); // 生产键盘 KeyBoard createKeyBoard(); } 2.联想工…
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声是他们的共同有的特性(这里说的词,曲,和声是当前实例化对象的属性,如果是对象的话,那我们就要使用抽象工厂了,第4会开始讲),只是词,曲的风格是不一样的!)) ModernTheme theme=new ModernTheme();//现代主题 常规的对象创建方法引发的问题是:当我们用户这时需要更换成…