设计模式之禅-抽象工程模式

个人blog 此篇博文地址为:http://www.sanyinchenblog.com/?p=268

抽象工厂模式:

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

上一章的的故事背景是女娲造人的故事,抽象工厂模式给出了这样一个背景:女娲造人之后发现人造出的人都是一个类型,没有七情六欲。于是女娲想再造一批人,这次打算造的丰富多彩一点,比如分男和女。

先来看一下uml类图:

我们来看一下NvWa类:

public class NvWa {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MaleFactory factory = new MaleFactory();
		Human human = factory.creatBlackHuman();
		printHuman(human);
		human = factory.creatWhiteHuman();
		printHuman(human);
		human = factory.creatYellowHuman();
		printHuman(human);
		FemaleFactory factory2 = new FemaleFactory();
		human = factory2.creatBlackHuman();
		printHuman(human);
		human = factory2.creatWhiteHuman();
		printHuman(human);
		human = factory2.creatYellowHuman();
		printHuman(human);
	}

	public static void printHuman(Human human) {
		System.out.println("-----------------");
		human.getColor();
		human.getSex();
		human.talk();
	}

}

FemaleFactory类为:

package com.sanyinchen.abstractfactory;

public class FemaleFactory implements HumanFactory {

	@Override
	public Human creatYellowHuman() {
		// TODO Auto-generated method stub
		return new FemaleYellowHuman();
	}

	@Override
	public Human creatBlackHuman() {
		// TODO Auto-generated method stub
		return new FemaleBlackHuman();
	}

	@Override
	public Human creatWhiteHuman() {
		// TODO Auto-generated method stub
		return new FemaleWhiteHuman();
	}

}

运行的结果为:

-----------------
黑人的皮肤是黑色的
男性黑种人
黑种人说话了
-----------------
白人的皮肤是黑色的
男性白种人
白种人说话了
-----------------
黄种人的皮肤是黑色的
男性黄种人
黄种人说话了
-----------------
黑人的皮肤是黑色的
女性黑种人
黑种人说话了
-----------------
白人的皮肤是黑色的
女性白种人
白种人说话了
-----------------
黄种人的皮肤是黑色的
女性黄种人
黄种人说话了

在抽象工厂模式中大家需要注意的是:有N个产品族,在抽象工厂类中就应该有N个创建方法。有M个产品等级就应该有M个实现工厂类,在每个工厂中,实现不同产品族的的生产任务。

抽象工厂模式的优点:

(1)具有良好的封装性

(2)产品族内约束为非公开状态

抽象工厂模式的缺点:

产品族扩展非常困难

时间: 2024-07-29 10:37:58

设计模式之禅-抽象工程模式的相关文章

设计模式之禅--抽象工厂模式

** 抽 **象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 抽象工厂模式的通用类图 抽象工厂是工厂方法模式的升级版本,在多个业务品种.业务分类时,通过抽象工厂模式生产所需要的对象是一种非常好的方式.所以理论上讲,工厂模式能做的事抽象工厂模式来做也没有问题,高版本兼容低版本嘛~ 开车了~ 女娲造人后传 女娲造人之后发现造出来的人太单调了,因为忘记给人类定义性别了.那现在我们给人类加上性别.其实这里就是一个添加业务品种的过程. 看我们的UML图 见代码 /

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

设计模式11:抽象工厂模式

阅读材料:http://baike.xsoftlab.net/view/209.html#3_2 抽象工程模式解决的问题: 当前有一套产品,称为A:另一套产品称为B.客户端代码需要在两套产品中切换. 抽象工厂模式相当于在简单工厂模式之上又抽象了一层,使得客户端代码在两套产品切换中比较方便. 但是抽象工厂模式还是会引发大量的改动.如果要减少改动,可以使用反射+简单工厂解决这个问题. UML: User相关代码: package abstractfactory; public abstract cl

设计模式C++实现——抽象工厂模式

模式定义: 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品时什么.这样一来,客户就从具体的产品中被解耦了. 模式结构: 举例: 数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现. UML设计: 编程实现及执行结果: #include <iostream> using namespace st

设计模式之抽象工程模式

1.定义:提供一个创建一系列相关或相互依赖对象接口,而无需指定它们的实体类. 2.引申: 每个模式都是针对一定问题的解决方案.抽象工厂模式面对的问题是多产品等级结构的系统设计.         在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级. 产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族.比如AMD的CPU和ADM芯片的主板,组成一个家族.Intel的CPU和Intel芯片的主板,又组成一个家族.而这两个家族都来自于两个产品等级:CPU,主板.一个等级结构

设计模式---(简单工厂模式,工厂模式,抽象工程模式),单例模式,代理模式,装饰器

简单工厂模式    简单工厂模式并不属于GoF的23种设计模式.     那么为什么我要用工厂模式呢?请看下面的一段程序.  #include  <iostream> using  namespace  std; class  Fruit  { public:     Fruit(string  name)  {         this-­‐>name  =  name;         if  (name  ==  "apple")  {      

读秦小波《设计模式之禅》 -- 工厂模式

设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都配以适当的例子,非常适合学习设计模式的初学者,当然,程杰的<大话设计模式>也是非常好的一本书,都可以拿过来当做一本工具书随时查看理解设计的奥妙. 工厂模式 这个模式的名字就已经告诉了我们它想要做什么,就是让我们构造出一个工厂,然后生产我们需要的东西,即生成对象.那么,为什么要构造一个工厂呢,为什么

23种设计模式[3]:抽象工厂模式

一.简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一) 定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 类型:创建类模式 public interface SmsService { void sendSms(); } public class MontnetsService implements SmsService { @Override public void sendSms() { Syste

设计模式学习-抽象工厂模式

1.定义 提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类. 2.类图 3.代码示例 1 package com.zhaoyangwoo.abstractfactory; 2 3 /** 4 * Created by john on 16/5/2. 5 * @author wuzhaoyang 6 * <p> 7 * 抽象工厂:多个抽象产品类,派生出多个具体产品类:一个抽象工厂类,派生出多个具体工厂类:每个具体工厂类可创建多个具体产品类的实例. 8 * 即提供一个创建一系列相关或