《设计模式之禅》读书笔记(四)之抽象工厂模式

2024-02-04 16:30

本文主要是介绍《设计模式之禅》读书笔记(四)之抽象工厂模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《设计模式之禅》读书笔记(四)之抽象工厂模式

一、抽象工厂模式的定义

Provide an Interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)

抽象工厂模式的通用类图如下:

1240

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象时一种非常好的解决方式。

在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。例如制造汽车的左侧门和右侧门,这两个的数量应该是相等的——这是两个对象之间的约束,每个型号的车门都是不一样的,这是产品等级结构约束的。源码实现如下:

1. 抽象产品类
1.1 产品A的抽象产品类:
package definationAbstractFactoryPattern;/*** @Title: AbstractProductA* @description: 抽象产品实现类A* @author: gaoyakang* @date: 2017年11月19日 下午8:52:58* */
public abstract class AbstractProductA {//每个产品共有的方法public void shareMethod() {}//每个产品相同方法,不同实现public abstract void doSomething();
}
1.2 产品B的抽象产品类:
package definationAbstractFactoryPattern;
/*** @Title: AbstractProductB* @description: 抽象产品实现类B* @author: gaoyakang* @date: 2017年11月19日 下午8:59:08* */
public abstract class AbstractProductB {//每个产品共有的方法public void shareMethod() {}//每个产品相同方法,不同实现public abstract void doSomething();
}
2. 产品实现类
package definationAbstractFactoryPattern;/*** @Title: ProductA1* @description: 产品A1的实现类* @author: gaoyakang* @date: 2017年11月19日 下午8:54:37* */
public class ProductA1 extends AbstractProductA{@Overridepublic void doSomething() {System.out.println("产品A1的实现方法");}
}
package definationAbstractFactoryPattern;
/*** @Title: ProductA2* @description: 产品A2的实现类* @author: gaoyakang* @date: 2017年11月19日 下午8:55:49* */
public class ProductA2 extends AbstractProductA{@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("产品A2的实现方法");}
}
package definationAbstractFactoryPattern;
/*** @Title: ProductB1* @description: 产品B1的实现类* @author: gaoyakang* @date: 2017年11月19日 下午8:59:48* */
public class ProductB1 extends AbstractProductB{@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("产品B1的实现方法");}
}
package definationAbstractFactoryPattern;
/*** @Title: ProductB2* @description: 产品B2的实现类* @author: gaoyakang* @date: 2017年11月19日 下午8:59:48* */
public class ProductB2 extends AbstractProductB{/* (non-Javadoc)* @see definationAbstractFactoryPattern.AbstractProductB#doSomething()*/@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("产品B1的实现方法");}}
3. 抽象工厂类

有N个产品族,在抽象工厂类中就应该有N个创建方法

package definationAbstractFactoryPattern;
/*** @Title: AbstractCreator* @description: 抽象工厂类* @author: gaoyakang* @date: 2017年11月19日 下午8:57:12* */
public abstract class AbstractCreator {//创建A产品家族public abstract AbstractProductA createProductA();//创建B产品家族public abstract AbstractProductB createProductB();
}
4. 产品的实现类

创建产品是由具体的实现类来完成的

4.1 产品等级1的实现类
package definationAbstractFactoryPattern;
/*** @Title: Creator1* @description: 生产产品等级1的产品* @author: gaoyakang* @date: 2017年11月19日 下午9:04:09* */
public class Creator1 extends AbstractCreator{@Overridepublic AbstractProductA createProductA() {//只生产产品等级为1的A产品return new ProductA1();}@Overridepublic AbstractProductB createProductB() {//只生产产品等级为1的B产品return new ProductB1();}
}
4.2 产品等级2的实现类
package definationAbstractFactoryPattern;
/*** @Title: Creator2* @description: 生产产品等级2的产品* @author: gaoyakang* @date: 2017年11月19日 下午9:06:03* */
public class Creator2 extends AbstractCreator{@Overridepublic AbstractProductA createProductA() {//只生产产品等级为2的A产品return new ProductA2();}@Overridepublic AbstractProductB createProductB() {//只生产产品等级为2的B产品return new ProductB2();}
}
5. 场景类
package definationAbstractFactoryPattern;
/*** @Title: Client* @description: 场景类* @author: gaoyakang* @date: 2017年11月19日 下午9:08:45* */
public class Client {public static void main(String[] args) {//定义出两个工厂AbstractCreator creator1=new Creator1();AbstractCreator creator2=new Creator2();//产生A1对象AbstractProductA a1=creator1.createProductA();//产生A2对象AbstractProductA a2=creator2.createProductA();//产生B1对象AbstractProductB b1=creator1.createProductB();//产品B2对象AbstractProductB b2=creator2.createProductB();a1.doSomething();a2.doSomething();b1.doSomething();b2.doSomething();}
}

二、抽象工厂模式的应用

抽象工厂模式的优点
  1. 封装性:不用关心对象是如何创建出来的,而只需要关心接口的。
  2. 产品族内的约束为非公开状态:例如男女比例为1.2:1,那么这个关系只要在工厂类中实现就可以了,而高层模块调用时不用关心这个约束。
抽象工厂模式的缺点

最大的缺点是产品族的扩展十分困难,例如我需要增加一个产品C,那么首先我需要增加一个抽象产品类AbstractProductC,其次增加产品C各等级的实现类,最后AbstractCreator还需要增加一个方法createProductC(),并且两个产品等级的实现类也需要有相应的修改,这严重影响了开闭原则

抽象工厂模式的使用场景

一个对象族或是一组没有任何关系的对象都有相同的约束,则可以使用抽象工厂模式。

抽象工厂模式的注意事项

抽象工厂模式的缺点是产品族的扩展困难,而不是产品等级的扩展困难。该模式下,产品等级是容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。在只扩展产品等级这一点上看,抽象工厂模式是符合开闭原则的。


三、书中女娲造人例子源码

简而言之,这个例子是制造制造三种肤色的人,且人有男女之分。

1. 人种接口
/*** @Title: Human* @description: 人种接口* @author: gaoyakang* @date: 2017年11月13日 上午7:21:02* */
public interface Human {//每个人有相应的颜色public void getColor();//每个人都会说话public void talk();//每个人都有性别public void getSex();
}
2. 白色人种
/*** @Title: AbstractWhiteHuman* @description: * @author: gaoyakang* @date: 2017年11月13日 上午7:22:33* */
public abstract class AbstractWhiteHuman implements Human{public void getColor() {System.out.println("白色人种的皮肤都是白色的!");}public void talk() {System.out.println("白色人种会说话,一般都是单字节!");}
}
3. 黑色人种
/*** @Title: AbstractBlackHuman* @description: * @author: gaoyakang* @date: 2017年11月13日 上午7:24:57* */
public abstract class AbstractBlackHuman implements Human {@Overridepublic void getColor() {System.out.println("黑色人种的皮肤都是黑色的!");}@Overridepublic void talk() {System.out.println("黑人会说话,一般人听不懂。");}
}
4. 黄色人种
/*** @Title: AbstractYellowHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午6:58:18* */
public abstract class AbstractYellowHuman implements Human{@Overridepublic void getColor() {System.out.println("黄色人种的皮肤是黄色的!");     }@Overridepublic void talk() {System.out.println("黄色人种会说话,一般说的是双音节。");}
}
5. 各种肤色人种不同性别的实现类

因为有三种肤色两种性别所以一共有6个实现类

5.1 黄色女性人种
/*** @Title: FamaleYellowHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午7:04:43* */
public class FemaleYellowHuman  extends AbstractYellowHuman{@Overridepublic void getSex() {System.out.println("黄人女性");}
}
5.2 黄色男性人种
/*** @Title: MaleYellowHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午7:05:36* */
public class MaleYellowHuman extends AbstractYellowHuman{@Overridepublic void getSex() {System.out.println("黄人男性");}
}
5.3 白色女性人种
/*** @Title: FemaleWhiteHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午7:07:49* */
public class FemaleWhiteHuman extends AbstractWhiteHuman{@Overridepublic void getSex() {// TODO Auto-generated method stubSystem.out.println("白人女性");}
}
5.4 白色男性人种
/*** @Title: MaleWhiteHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午7:08:24* */
public class MaleWhiteHuman extends AbstractWhiteHuman{@Overridepublic void getSex() {System.out.println("白人男性");}
}
5.5 黑色女性人种
/*** @Title: FemaleBlackHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午7:06:40* */
public class FemaleBlackHuman extends AbstractBlackHuman{@Overridepublic void getSex() {// TODO Auto-generated method stubSystem.out.println("黑人女性");}
}
5.6 黑色男性人种
/*** @Title: MaleBlackHuman* @description: * @author: gaoyakang* @date: 2017年11月15日 上午7:07:16* */
public class MaleBlackHuman extends AbstractBlackHuman{@Overridepublic void getSex() {System.out.println("黑人男性");}
}
6. 八卦炉的定义
/*** @Title: HumanFactory* @description: * @author: gaoyakang* @date: 2017年11月16日 下午9:13:48* */
public interface HumanFactory {//制造一个黄色人种public Human createYellowHuman();//制造一个白色人种public Human createWhiteHuman();//制造一个黑色人种public Human createBlackHuman();
}
7. 生产女性的八卦炉
/*** @Title: FemaleFactory* @description: * @author: gaoyakang* @date: 2017年11月16日 下午9:15:22* */
public class FemaleFactory implements HumanFactory{@Overridepublic Human createYellowHuman() {return new FemaleYellowHuman();}@Overridepublic Human createWhiteHuman() {return new FemaleWhiteHuman();}@Overridepublic Human createBlackHuman() {return new FemaleBlackHuman();}
}
8. 生产男性的八卦炉
/*** @Title: MaleFactory* @description: * @author: gaoyakang* @date: 2017年11月16日 下午10:02:02* */
public class MaleFactory implements HumanFactory{@Overridepublic Human createYellowHuman() {return new MaleYellowHuman();}@Overridepublic Human createWhiteHuman() {return new MaleWhiteHuman();}@Overridepublic Human createBlackHuman() {return new MaleBlackHuman();}}
9. 具体场景类(女娲造人)
/*** @Title: NvWa* @description: * @author: gaoyakang* @date: 2017年11月16日 下午10:04:11* */
public class NvWa {public static void main(String[] args) {//第一条生产线,男性生产线HumanFactory maleHumanFactory=new MaleFactory();//第二条生产线,女性生产线HumanFactory feMaleHumanFactory=new MaleFactory();Human maleYellowHuman=maleHumanFactory.createYellowHuman();maleYellowHuman.getColor();maleYellowHuman.getSex();maleYellowHuman.talk();Human femaleYellowHuman=feMaleHumanFactory.createYellowHuman();femaleYellowHuman.getColor();femaleYellowHuman.getSex();femaleYellowHuman.talk();}
}

转载于:https://www.cnblogs.com/rever/p/7879833.html

这篇关于《设计模式之禅》读书笔记(四)之抽象工厂模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678136

相关文章

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

Builder模式的实现

概念 在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码: AlertDialog的实现 AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle

人机的三级抽象

数学的三级抽象包括第一级抽象是数表示万物、第二级抽象是字母表征数、第三级抽象是运算规则的抽象(如群论),在人机交互中,类比于数学的三级抽象,可以理解为: 第一级抽象:用户界面和操作的抽象化。这一级别涉及到将用户与计算机之间的交互过程抽象化,使得用户可以通过直观的界面和操作来控制计算机或者访问信息。例如,图形用户界面 (GUI) 将复杂的计算机功能和操作抽象为图标、按钮和菜单,使用户能够轻松地进行

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

高性能MYsql读书笔记-加快alter table操作的速度

alte tabe 会导致事务中断。 方法1  使用 alter column 代替 modify column  方法2  不推荐。。 ALTER TABLE      [  ALTER COLUMN    / MODIFY COLUMN  /  CHANGE COLUMN  ] ALTER TABLE sakila.film MODIFY COLUMN rental

《分析模式》“鸦脚”表示法起源,Everest、Barker和Hay

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》这本书里面用的并不是UML表示法。作者Martin Fowler在书中也说了,该书写于1994-1995年,当时还没有UML。作者在书中用的是一种常被人称为“鸦脚”的表示法。  有的同学会有误解,例如有同学发表以下感想: “鸦脚”表示法当然不是Fowler先使用的。F