抽象工厂模式

大白话抽象工厂模式(Abstract Factory Pattern)

五迷三道 提交于 2020-01-06 22:23:18
实例分析 大白话工厂方法模式(Factory Method) 一文中,我们讲解了日产4S店工厂规模的扩大,创建了针对不同车型的工厂,减少了工厂的工作内容,提高了效率。下面我们继续以4S店的故事讨论抽象工厂模式。 为了满足各个阶层的客户,日产公司推出了豪华系列品牌 英菲尼迪 ,而且为了吸引客户购买,购车赠送行车记录仪,购买日产汽车赠送日产行车记录仪。购买英菲尼迪汽车赠送英菲尼迪行车记录仪。 通过上面的描述我们引出产品族和等级结构的定义。 产品族 :即来自一个家族,比如英菲尼迪汽车和英菲尼迪行车记录仪都来自英菲尼迪家族,日产汽车和日产行车记录仪都来自日产家族。 等级结构 :可以理解为相同的产品,比如英菲尼迪汽车和日产汽车处于同一个等级结构,英菲尼迪行车记录仪和日产行车记录仪处于同一个等级结构。 现在假设工厂分为日产工厂和英菲尼迪工厂,且汽车和行车记录仪都只有一种型号。日产工厂需要生产相同产品族的日产汽车和日产行车记录仪。英菲尼迪工厂需要生产相同产品族的英菲尼迪汽车和英菲尼迪行车记录仪。 通过对比,发现和工厂方法模式的区别为: 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构 代码如下: 代码片段1 汽车父类 /** * 汽车的父类 * @author coderzcr */ public abstract class Car { String name ;

GOF 23设计模式之(创建型模式)

倖福魔咒の 提交于 2020-01-06 21:52:25
目录 1.单例模式 1.1饿汉模式 1.2懒汉模式 1.3其他单例模式 2.原型模式 2.1 浅克隆 2.2深克隆 3.工厂模式 3.1简单工厂模式 3.2工厂方法 4.抽象工厂模式 5.建造者模式 一、单例模式(Singleton)   保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。   优点:由于只生成一个实例,减少了系统性能开销。可以在系统中设置全局的访问点,优化环境共享资源访问。如:可以设置一个单例类,负责所有数据表的映射处理。   常见的单例模式:     饿汉模式(线程安全,调用效率高,不能延迟加载)(主要)     懒汉模式(线程安全,调用效率不高,可以延迟加载)(主要)     双重检测锁(由于JVM底层内部模型原因,偶尔会出现问题,不推荐使用)     静态内部类式(线程安全,调用效率高,可以延迟加载)     枚举单例(线程安全,调用效率高,不能延迟加载)   单例模式UML图:       (1) 饿汉模式     问题:如果只是加载本类、不调用本类的getInstance()方法,或永远不调用本类。就会造成资源的浪费。 class eh{ //(1)直接创建私有实例对象 private static final eh texteh = new eh(); //(2)私有无参的构造函数 private eh() {} //(3

【设计模式自习室】理解工厂模式的三种形式

折月煮酒 提交于 2020-01-04 00:19:06
前言 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 实际使用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部) 也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇:为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 创建型——简单工厂/工厂模式/抽象工厂 引子 工厂模式是一个非常重要的创建型模式,但是工厂模式又分为好多种,并且网上文章很多,很多对工厂模式的定义都不是很明确,甚至还互相冲突,本文希望通过放在一起串讲的形式,力求能够用最简洁的语言 理清 工厂模式。 先看一个工厂模式的定义: “Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to

JAVA设计模式

余生颓废 提交于 2020-01-02 17:03:46
1、单例模式 定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 通用代码:(是线程安全的) public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是 static public static void doSomething(){ } } 使用场景: ● 要求生成唯一序列号的环境; ● 在整个项目中需要一个共享访问点或共享数据,例如一个 Web 页面上的计数 器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确 保是线程安全的; ● 创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源; ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式 (当然,也可以直接声明为 static 的方式)。 线程不安全实例: public class Singleton { private static Singleton singleton = null; /

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

主宰稳场 提交于 2019-12-30 22:59:41
  以下内容重点介绍的设计模式中的抽象工厂模式,采用Java提供一个应用范例,分析其代码结构特性。结合具体案例分析引入抽象工厂模式后对系统架构和代码结构带来的好处,分析其中用到的多态机制,说明模块抽象封装的方法, 分析各个模块的内聚度和模块之间的耦合度。 1、什么是抽象工厂模式   工厂模式的本质是实例化对象时,用工厂方法代替new操作。将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。一般工厂模式分为三种,简单工厂模式,工厂方法模式,以及抽象工厂模式。简单工厂模式实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。而工厂方法模式是对简单工厂模式进一步的解耦,因为在工厂方法模式中是一个子类对应一个工厂类,而这些工厂类都实现于一个抽象接口。这相当于是把原本会因为业务代码而庞大的简单工厂类,拆分成了一个个的工厂类,这样代码就不会都耦合在同一个类里了。   前面介绍的工厂方法模式中考虑的是一类产品的生产,同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品。简而言之,抽象工厂模式是用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;

C#设计模式之6:抽象工厂模式

淺唱寂寞╮ 提交于 2019-12-28 15:43:10
前面分析了简单工厂模式和工厂方法模式,接着来看一下抽象工厂模式,他与工厂方法模式有一些相似的地方,也有不同的地方。 先来看一个不用工厂方法模式实现的订购披萨的代码: 对象依赖的问题:当你直接实例化一个对象时,就是在依赖他的具体类。接着上面的例子,如果在一个PizzaStore里面直接创建很多对象时,他们的依赖关系是这样的: 这里引出一个概念: 依赖倒置。 很清楚的代码里减少具体类的依赖是一件好事。依赖倒置的定义是:要依赖抽象,不要依赖实现。这个原则说说明了:不能让高层组建依赖底层组件,而且,不管是高层组件还是底层组件,他们都要依赖抽象。所谓的高层组件,是由其它底层组件定义其行为的类。例如。PizzaStore是个高层组件,因为他的行为是由比萨定义的:PizzaStore创建所有不同的比萨对象,准备、烘烤、切片、装盒;而披萨本身属于低层组件。 原则的应用 上图展示的问题在于,它依赖每个比萨类型,因为它是在自己的orderPizza方法中,实例化这些具体类型的。虽然我们已经创建了一个抽象,就是Pizza,但是我们仍然在代码中,实际的创建了具体的pizza,所以,这个抽象没有什么影响力。如何在OrderPizza方法中,将这些实例化对象的代码独立出来,我们都知道, 工厂方法 刚好能排上用场。所以,应用工厂方法之后。类图看起来就像这: 在应用了工厂方法模式之后( 参考工厂方法模式 )

抽象工厂

走远了吗. 提交于 2019-12-25 04:50:38
抽象工厂模式是工厂模式的进一步推广,假设一个子系统需要一些产品对象,而这些产品对象有属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和创建的责任分开,就可用抽象工厂模式。例如一个大棚生产食物,有水果和蔬菜,而水果和蔬菜不是一个产品等级结构,所以要用抽象工厂模式。 抽象工厂模式是所有工厂模式中最为抽象和具一般性的一种形态,向客户端提供一个接口,使客户端在不必指定产品具体类型的情况下创建多个产品族中的产品对像。 工厂方法模式是针对一个产品等级结构,抽象工厂模式需要面对多个产品等级结构 概述 在工厂方法模式中,我们使用一个工厂创建一个产品,也就是说一个具体的工厂对应一个具体的产品。但是有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。 产品等级结构,就是产品的继承结构。一个为空调的抽象类,有海尔空调,美的空调等子类,这个抽象类空调和他的子类就构成了产品等级结构。 产品族,同一个工厂生产的,位于不同产品结构中的,功能相关联的产品组成的家族, 抽象工厂提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 有3个产品等级结构和4个产品族。如果用工厂方法模式,由于产品结构平行,则需要3个平行的工厂等级结构,随着等级结构数目的增加,工厂等级结构数目也会增加,抽象工厂模式用一个工厂等级结构负责三个不同等级结构产品对象的创建。

工厂方法模式与抽象工厂模式

此生再无相见时 提交于 2019-12-24 10:40:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 工厂方法设计模式: 一个抽象的产品类,派生出多个不同的产品,一个抽象工厂类,派生出多个不同的抽象工厂,每个工厂对应一个抽象的产品类。 缺点:在我们想要增加一个新的产品的时候,我们需要新增 一个对应的工厂。 举个例子:例如一个运算类,有加法类继承它,减法类继承它,同时实现它的抽象方法(计算方法), 这时候我们就需要有加法工厂,减法工厂来与运算类一一对应。 客户端如果需要减法功能,就从减法工厂中获取一个减法类的实例,然后调用其方法即可。 public abstract class operation { //产品抽象基类 public int number1; public int number2; public abstract Object operation(); } public class add extends operation { //加法类 @Override public Object operation() { return number1+number2; } } public abstract class factory { //基本工厂,返回产品基类 public abstract operation getOpFactory(); } public class AddFactory

Java 面试前的基础准备 - 01

独自空忆成欢 提交于 2019-12-22 03:17:34
使用这个在线网页编辑真的是不习惯,还是 windows live writer 好。 下面列一个清单用于最近的面试:( 清单是网上down的 ) static,final,transient 等关键字的作用 foreach 实现原理 synchronized 和 volatile关键字 List,Map,Set 及其各种实现类,底层实现原理,实现类的优缺点 设计模式(单例【懒汉,饿汉,静态代码块,线程安全不安全】,工厂,观察,包装) 多线程(Runable 和 Thread) 什么是线程池, 以及线程池的优点 sleep() 和 wait() 的区别 IO(字节,字符,序列,内存,对象,打印。。。) 反射机制和内省机制 解析 xml文件几种方式的原理与特点 [ Dom, SAX, PULL ] sql 和 nosql(mysql 和 redis) 数据结构和算法(栈,队列,链表,树,图,排序,搜索) JDK 源码 JVM(GC 算法,垃圾回收器,类加载器,双委派类型,Java 内存模型,happens-before 原则) web 分布式 session 实现的方式(4种) SOA,RPC,dubbo 再添加几个快烂掉的点:override 和 overload,final 和 finally, static 关键字的作用: 作用在类上(该类 必须只能 是内部类,访问内部类的成员时

简单工厂、工厂、抽象工厂形象故事分析及理解

半世苍凉 提交于 2019-12-17 04:28:16
现在以工厂生产的方式来理解简单工厂、工厂、抽象工厂有什么不同。只需要记住以下三点: 一个模具生产出所有的产品 =》简单工厂模式 一套模具生产出所有的产品 =》工厂模式 多套模具生产所有的产品 =》抽象工厂模式 木料生产厂: 故事:工厂刚起步的时候,人少、产品也很少,老板就要求模具工用一个模具只需要改变外部尺寸就能生产出工厂的所有产品。因为工厂比较穷,生产的东西少而且简单。若要新增一个大一点的产品,就只需改一下模具,让模具能生产出新尺寸的产品,这就叫做简单工厂模式(要生产新产品只需要改一下模具的兼容性,生产出新的类似产品)。慢慢的通过工厂老板和员工的努力,工厂慢慢的扩大了,相应的生产的产品也慢慢增多了。用一个模具来生产那么多产品会出现一个问题,就是新来的一个员工修改当前的模具兼容现在需要的新产品的时候,不小心改错了一点参数,导致新的产品做不出来,更导致旧的产品也生产不出来,导致工厂停产,问题非常严重,老板非常气愤。所以老板就想啊,想。。。想到要不做一套模具,一个模具就做一个产品。一个稳定的产品对应的模具也不能修改,虽然浪费了好多钱去做模具(好多工厂类),但是情况非常好,旧的模具只要稳定了就不会去修改了,若要做新的产品就直接做一个新的模具,这样子旧的不改,新的增加,这样子就可以完美避开一个模具Over,全部产品不能生产的情况。这就是工厂模式(一套模具生产所有的产品