工厂模式[3] 抽象工厂 Abstract Factory
简介
1、简单工厂,或静态工厂,产品接口
- 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口
- 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的构造方法是怎么new的),消除了客户端直接创建产品对象的责任,实现了对责任的分割。
- 缺点:工厂类记录了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响;而且当产品种类多、结构复杂的时候,把所有创建工作放进一个工厂中来,会使后期程序的扩展较为困难。
2、工厂方法,工厂接口+产品接口
- 定义:在简单工厂的基础上,为工厂类定义了工厂接口,让其子类决定实例化哪个产品类。
- 优点:简单工厂是把创建产品的职能都全部放在一个类里面,而工厂方法则是把不同的产品放在实现了工厂接口的不同工厂类里面,分割了工厂类的职能。
3、抽象工厂
- 定义:抽象工厂提供一个固定的接口,用于创建一系列由关联或者相依存的对象,而不必指定其具体类或其创建的细节
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点。工厂方法:一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;【每个】具体工厂类只能创建【一个】具体产品类的实例。即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。【一对一】的关系。抽象工厂:多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;【每个】具体工厂类可创建【多个】具体产品类的实例。即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。【一对多】的关系。
抽象工厂
先修改人类定义的接口/*** 定义一个人类的统称,问题出来了,刚刚定义的时候忘记定义性别了,这个重要的问题非修改不可,否则这个世界上太多太多的东西不存在了*/public interface IHuman {public void talk();//定义性别,注意,这个是用来给人类【分类】的,在抽象工厂中,很重要的一步就是合理的分类public void sex();}人类的接口定义好,然后根据接口创建两个抽象类,也就是两个【产品等级】,其实,抽象类的目的就是不允许你 new。public abstract class AbstractWhiteHuman implements IHuman {@Overridepublic void talk() {System.out.println("白色人种会说English");}}public abstract class AbstractYellowHuman implements IHuman {@Overridepublic void talk() {System.out.println("黄种人会说汉语");}}然后就是些实现类了public class YellowFemaleHuman extends AbstractYellowHuman {@Overridepublic void sex() {System.out.println("女性黄种人");}}public class YellowMaleHuman extends AbstractYellowHuman {public void sex() {System.out.println("男行黄种人");}}抽象工厂模式下的【产品等级】和【产品族】都已经完成,下一步就等着工厂开工创建了,那我们来看工厂类。在看工厂类之前我们先看那个枚举类型public enum HumanEnum {//把世界上所有人类型都定义出来YelloMaleHuman("AbstractFactory.YellowMaleHuman"), YelloFemaleHuman("AbstractFactory.YellowFemaleHuman"), //WhiteFemaleHuman("AbstractFactory.WhiteFemaleHuman"), WhiteMaleHuman("AbstractFactory.WhiteMaleHuman");private String value="";//定义构造函数,目的是Data(value)类型的相匹配private HumanEnum(String value) {this.value = value;}public String getValue() {return this.value;}}然后,我们看我们的工厂类,先看接口/*** 定一个烤箱,泥巴塞进去,人就出来*/public interface IHumanFactory {//制造黄色人种public IHuman createYellowHuman();//制造一个白色人种public IHuman createWhiteHuman();}然后看工厂的抽象类public abstract class AbstractHumanFactory implements IHumanFactory {//给定一个性别人种,创建一个人类出来 专业术语是产生产品等级protected IHuman createHuman(HumanEnum humanEnum) {IHuman human = null;if (!humanEnum.getValue().equals("")) {//如果传递进来不是一个Enum中具体的一个Element的话,则不处理try {human = (IHuman) Class.forName(humanEnum.getValue()).newInstance();//直接产生一个实例} catch (Exception e) {//因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;e.printStackTrace();}}return human;}}看到没,这就是引入 enum 的好处,createHuman(HumanEnum humanEnum)这个方法定义了输入参数必须是 HumanEnum 类型,然后直接使用 humanEnum.getValue()方法就能获得具体传递进来的值。这个抽象类的目的就是减少下边实现类的代码量。我们看实现类/*** 男性创建工厂,只创建男性*/public class MaleHumanFactory extends AbstractHumanFactory {//创建一个男性白种人@Overridepublic IHuman createWhiteHuman() {return super.createHuman(HumanEnum.WhiteMaleHuman);}//创建一个男性黄种人@Overridepublic IHuman createYellowHuman() {return super.createHuman(HumanEnum.YelloMaleHuman);}}/*** 女性创建工厂,只创建女性*/public class FemaleHumanFactory extends AbstractHumanFactory {//创建一个女性白种人@Overridepublic IHuman createWhiteHuman() {return super.createHuman(HumanEnum.WhiteFemaleHuman);}//创建一个女性黄种人\@Overridepublic IHuman createYellowHuman() {return super.createHuman(HumanEnum.YelloFemaleHuman);}}产品定义好了,工厂也定义好了,万事俱备只欠东风,那咱就开始造人吧,哦,不对,女娲开始造人了:public class Test {//女娲建立起了两条生产线,分别是男性生产线和女性生产线public static void main(String[] args) {//第一条生产线,男性生产线,可以生产各种各样的男性IHumanFactory maleHumanFactory = new MaleHumanFactory();IHuman maleYellowHuman = maleHumanFactory.createYellowHuman();//生产黄色的男性IHuman maleWhiteHuman = maleHumanFactory.createWhiteHuman();//生产白色的男性maleYellowHuman.sex();maleWhiteHuman.sex();System.out.println("\n\n");//第二条生产线,女性生产线,可以生产各种各样的女性IHumanFactory femaleHumanFactory = new FemaleHumanFactory();IHuman femaleYellowHuman = femaleHumanFactory.createYellowHuman();//生产黄色的女性IHuman femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();//生产白色的女性femaleYellowHuman.sex();femaleWhiteHuman.sex();}}
附件列表
工厂模式[3] 抽象工厂 Abstract Factory的更多相关文章
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...
- c#工厂模式与抽象工厂模式
一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]
1 2 {<HeadFirst设计模式>工厂模式之抽象工厂 } 3 { 抽象工厂的产品 } 4 { 编译工具:Delphi7.0 ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- C#设计模式--工厂模式和抽象工厂模式
话说有三大潮牌公司一直相互PK,有一天举办了一个活动让这三大公司来一个PK,我们来看看哪家公司的上衣做出来好看穿得舒服 现在我们有一个上衣的抽象产品让三大公司来做 //抽象产品 public inte ...
- factory工厂模式之抽象工厂AbstractFactory
* 抽象工厂: 意图在于创建一系列互相关联或互相依赖的对象. * 每个工厂都会创建一个或多个一系列的产品 * 适用于:产品不会变动,开始时所有产品都创建好,然后根据分类获取想要的 某一类产品(很像sp ...
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Objective-C 工厂模式(下) -- 抽象工厂模式
相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的 抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产 比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买 ...
- [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)
一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...
随机推荐
- 利用python建表
(ENV)carlo@ubuntu:~/flasky$ python hello.py shell >>> from hello import db>>> db.d ...
- JS:window.onload的使用介绍
作者: 字体:[增加 减小] 类型:转载 时间:2013-11-13我要评论 window.onload在某些情况下还是比较实用的,比如加载时执行哪些脚本等等,下面有几个不错的示例,需要的朋友可以参考 ...
- IOS--UILabel的使用方法详细
IOS-UILabel的使用方法详细 //UILabel的使用 UILabel *oneLabel = [[UILabel alloc] init]; // 最经常使用的 oneLabel.fra ...
- 应用SecureCRT(发送接收文件)
使用 SecureCRT 和 cz. sz,可以从 Linux 服务器上下载/上传文件. Linux 上要安装 lszrz 包 (1)编译安装root 账号登陆后,依次执行以下命令 cd /tmp w ...
- 【Java】ArrayList和LinkedList的区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Pair of Numbers
Codeforces Round #209 (Div. 2) D:http://codeforces.com/contest/359/problem/D 题意:给以一个n个数的序列,然后问你最大的区间 ...
- Qt之自定义托盘(两种方法)
http://www.cnblogs.com/swarmbees/p/5789482.html http://www.cnblogs.com/swarmbees/p/5812031.html
- 【模拟】【数学】CSU 1803 2016 (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 题目大意: 给定n,m(n,m<=109)1<=i<=n,1& ...
- 开源库CImg 数据格式存储之二(RGB 顺序)
在上一篇博客中已经初步说明了GDI和CImg数据的存储格式感谢博友 Imageshop 评论说明 CImg的说明文档中已有详细说明(详见上篇博客说明) CImg的数据格式确实是RRRGGGBBB顺序存 ...
- JQuery固定表头插件fixedtableheader源码注释
在开发XX车站信息系统时,需要将大量数据显示在一个巨大的表格内部,由于表格是一个整体,无法分页,加之数据很多,超出一屏,为了方便用户,决定使用固定表头的插件,经过测试,发现JQuery 插件:fixe ...