模式的介绍

模式的定义

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

为创建一组相关的或相互依赖的对象提供一个接口,而无须指定他们的具体类。

类型

创造类

模式的使用场景

抽象工厂模式的使用场景定义非常简单:一个对象族(或一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

UML类图

角色介绍

(1)AbstractProduct类:抽象产品类的定义
(2)ConcretePorduct类:具体产品的实现
(3)AbstractFactory类:抽象工厂的定义
(4)ConcreteFactory类:具体工厂的实现

模式的简单实现

定义一个猫的抽象类:

public abstract class ACat {public abstract void color();
}

再实现一个黑猫类和白猫类:

public class WhiteCat extends ACat{@Overridepublic void color() {// TODO Auto-generated method stubSystem.out.println("i am is a white cat");}
}
public class BlackCat extends ACat {@Overridepublic void color() {// TODO Auto-generated method stubSystem.out.println("i am is a black cat");}
}

同样,定义一个狗的抽象类:

public abstract class ADog {public abstract void color();
}

实现二个颜色的具体狗类(黑狗,白狗):

public class WhiteDog extends ADog {@Overridepublic void color() {// TODO Auto-generated method stubSystem.out.println("i am is a white dog");}
}
public class BlackDog extends ADog {@Overridepublic void color() {// TODO Auto-generated method stubSystem.out.println("i am is a black dog");}
}

定义一个抽象工厂类,定义二个接口,一个创建cat,一个创建dog:

public abstract class AFactory {/**create cat**/public abstract ACat createCat();/**create dot**/public abstract ADog createDog();
}

实现一个white的工厂,负责创建white的dog和cat:

public class WhiteColorFactory extends AFactory{@Overridepublic ACat createCat() {// TODO Auto-generated method stubreturn new WhiteCat();}@Overridepublic ADog createDog() {// TODO Auto-generated method stubreturn new WhiteDog();}
}

同样,实现一个black的工厂,负责创建black的dog和cat:

public class BlackColorFactory extends AFactory{@Overridepublic ACat createCat() {// TODO Auto-generated method stubreturn new BlackCat();}@Overridepublic ADog createDog() {// TODO Auto-generated method stubreturn new BlackDog();}
}

Client调用:

public class AbstractFactory {public static void main(String[] args) {// TODO Auto-generated method stubAFactory whiteColorFactory = new WhiteColorFactory();ACat whiteCat = WhiteColorFactory.createCat();whiteCat.color();ADog whiteDog = whiteColorFactory.createDog();whiteDog.color();AFactory blackColorFactory = new BlackColorFactory();ACat blackCat = BlackColorFactory.createCat();blackCat.color();ADog blackDog = blackColorFactory.createDog();blackDog.color();}
}

输出结果:

i am is a white cat
i am is a white dog
i am is a black cat
i am is a black dog

到此,我们会发现,我们的源码目录下已经有十个类了,实现一个这么简单的功能,我们竟然要用十个类,要是更复杂的产品关系,那会是把人淹死在类的汪洋大海里的节奏啊。那么结论来了,抽象工厂模式会产生许多中间类,导致复杂度增加,这也是此模式的一大缺点。

再来分析此模式,假如,我们要再添加一种颜色(如灰–gray)的cat和dog(也就是要在一个产品中新增一个等级),我们可以如下修改:
我们再分别新建一个GrayCat和GrayDog类,再新增一个GrayColorFactory类分别创建gray cat和gray dog。需求通过简单的扩展就可以实现。修改后的类图如下:

假如,现在我们在添加一个创建猪(pig)的对象(也就是说要新增一个产品族),那么,我们会发现,这个修改首先要在AFactory(工厂抽象类)中创建一个createPig抽象方法,然后再对应的把所有的具体的工厂类(BlackColorFactory ,WhiteColorFactory )都要对应的修改。非常明显,这严重违反了开闭原则。我们说抽象类和接口是一个契约,改变契约会导致所有与契约有关系的代码都要修改,那么这段代码叫“有毒代码”。这也是抽象工厂模式的另一个缺点。

也就是说 抽象工厂模式横向(新增产品等级)扩展容易,纵向(新增产品族)扩展困难。

模式的优缺点

优点

封装性
高层模块只关心工厂类的接口和抽象,只要知道工厂类的接口,我们就可以创建也一个需要的对象,省时省力。而工厂类则负责对象的创建细节。

缺点

抽象模式最大的缺点是口中间类比较多,增加了系统的复杂度,使用起来比较复杂。想想,光最简单的抽象工厂模式,与产品相关的类就达到了6个,与工厂相关的类也有3个,这里就有9个类,如果稍微复杂一点的产品,可以想象的到类的数目会更多,这也是我们平时比较少的用到此模式的根本原因。

抽象工厂模式的另一个缺点是产品族扩展困难。

Android源码中的模式实现

基于抽象工厂模式的缺点,我们应用此模式不多,我现在还没有在android源码中见到此模式,后补:

参考资料

(1)设计模式(二)—– 抽象工厂(AbstractFactory)—-(JAVA版)
http://blog.csdn.net/hfreeman2011/article/details/8350196
(2).设计模式之禅—第9章 抽象工厂模式

设计模式之抽象工厂模式---abstract factory相关推荐

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  4. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  5. 设计模式剖析——抽象工厂模式Abstract Factory Pattern

    含义 与工厂方法模式相比,概念有些不一样.有抽象零件.抽象产品.抽象工厂.用零件来组装出产品,组装出的产品才是完整的产品. 既然一个完整产品需要多个零件,那么每种具体工厂自然也需要可以同时生产出多种零 ...

  6. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  7. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 详解

    抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...

  9. 抽象工厂模式 Abstract Factory Pattern

    源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...

最新文章

  1. pytorch中LambdaLR的作用
  2. JAVA 利用SimpleDateFormat将String转换为格式化的日期
  3. Java 的工厂方法及代理模式
  4. linux__ftp
  5. spring依赖注入_Spring的依赖注入陷阱
  6. c++编写算法判断二叉树是否为完全二叉树_字节面试官:连这90道LeetCode算法题都不会也来面试?...
  7. linux建ftp用户限制访问,Linux下建ftp用户并限制用户访问路径
  8. 从本科到研究生,看大疆工程师给你定制的机器人学习计划
  9. 数论入门符号_大符号入门指南第2部分
  10. react小书 笔记6
  11. mysql 导出 客户端_MySQL 导出数据 导入数据
  12. SQLite3介绍及SQL语句详解(SQLite一)
  13. 分布式id黑科技完善
  14. 编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
  15. 微信小程序真机调试连接不到后台服务器,解决微信小程序wepy真机预览跟本地表现不一样,数据变化了视图没变化...
  16. Linux(CentOS)搭建redmine项目管理系统
  17. PLUG AND PLAY LANGUAGE MODELS: A SIMPLE APPROACH TO CONTROL LEDTEXT(PPLM):代码深入理解(二)—PPLM_Discrim
  18. 离职员工住房公积金提取办法(深圳)
  19. 关于C++、C#实现EXCEL数据库批量导入数据库万行以上数据效率问题
  20. git 拉取远程分支报错(fatal: ''xxx is not a commit and a branch '' cannot be created from it)

热门文章

  1. 骨传导耳机效果怎么样,相比传统耳机优点真是太多了
  2. 东北大学公共管理考研经验贴
  3. Tensorflow:张量(Tensor)的创建及其基础操作
  4. python3 opencv AttributeError: module 'cv2' has no attribute '__version__'
  5. 科创板|西部超导虹软科技等今日申购 网上申购上限最高9500股
  6. Python 中 shutil 的使用
  7. python getattr调用自己模块_python getattr调用自己模块_Python的getattr()
  8. 路由器的基本工作原理概述
  9. WebForm session,cookies
  10. 谈谈美国大学的常任轨(tenure track)制度