java设计模式 -------- 创建模式 之 抽象工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020

工厂方法模式和抽象工厂模式不好区分清楚:

工厂方法模式特点:

1. 一个抽象产品类,可以派生出多个具体产品类。
2. 一个抽象工厂类,可以派生出多个具体工厂类。
3. 每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式特点:

1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
2. 一个抽象工厂类,可以派生出多个具体工厂类。   
3. 每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。

两者的区别:

1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
3. 工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

还是以上面的例子,即四则运算来说明,假设这样一种情况,现在不光是要实现两个double型的数的加减法,还要实现两个整数之间的加减法,也就是要在原来的基础上增加两个整型数的相加减。

每一个模式都是针对一定问题的解决方案。抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

  在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。

   所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。如,可以将加法中的两个整型数相加,两个double型数进行相加,就构成一个产品族。

理解了这些后,那么如何用抽象工厂方法来实现两个整数的相加减和两个double型的数相加减呢,先看UML类图:

有了UML类图,很自然的,就可以写出各个类和接口,具体如下:

抽象工厂模式应用步骤:

1. 分别创建int型和double型的操作接口

public interface IntOperation {
	public int Operate(int a,int b);
}
public interface DoubleOperation {
	public double Operate(double a,double b);
}

2. 分别创建两种类型的加减法的实现类

public class IntAddOperation implements IntOperation {

	@Override
	public int Operate(int a, int b) {
		// TODO Auto-generated method stub
		return a+b;
	}
}
public class IntSubOperation implements IntOperation {
	@Override
	public int Operate(int a, int b) {
		// TODO Auto-generated method stub
		return a-b;
	}
}
public class DoubleAddOperation implements DoubleOperation {

	@Override
	public double Operate(double a, double b) {
		// TODO Auto-generated method stub
		return a+b;
	}
}
public class DoubleSubOperator implements DoubleOperation {

	@Override
	public double Operate(double a, double b) {
		// TODO Auto-generated method stub
		return a-b;
	}
}

3. 创建抽象工厂接口

public interface OperationFactory {
	public IntOperation createIntOperation();
	public DoubleOperation createDoubleOperation();
}

4. 创建加法和减法的工厂实现类

public class AddOperationFactory implements OperationFactory {

	@Override
	public IntOperation createIntOperation() {
		// TODO Auto-generated method stub
		return new IntAddOperation();
	}

	@Override
	public DoubleOperation createDoubleOperation() {
		// TODO Auto-generated method stub
		return new DoubleAddOperation();
	}
}
public class SubOperationFactory implements OperationFactory {

	@Override
	public IntOperation createIntOperation() {
		// TODO Auto-generated method stub
		return new IntSubOperation();
	}

	@Override
	public DoubleOperation createDoubleOperation() {
		// TODO Auto-generated method stub
		return new DoubleSubOperator();
	}
}

5. 创建测试类

public class OperationTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//加法工厂负责生产两个整型数的相加和两个double型的数相加
		OperationFactory of1 = new SubOperationFactory();
		IntOperation IntAdd = of1.createIntOperation();
		DoubleOperation DoubleAdd = of1.createDoubleOperation();
		System.out.println("10+25="+IntAdd.Operate(10, 25));
		System.out.println("10.2+25.3="+DoubleAdd.Operate(10.2, 25.3));

		//减法工厂负责生产两个整数的相减,以及两个double型数的相减
		OperationFactory of2 = new AddOperationFactory();
		IntOperation IntSub = of2.createIntOperation();
		DoubleOperation DoubleSub = of2.createDoubleOperation();
		System.out.println("10-25="+IntSub.Operate(10, 25));
		System.out.println("10.2-25.3="+DoubleSub.Operate(10.2, 25.3));
		}
}

执行结果:

10+25=-15
10.2+25.3=-15.100000000000001
10-25=35
10.2-25.3=35.5

这个例子总感觉不太恰当,目前我也在学习阶段,不是很懂,随着学习设计模式的深入,等理解了再次来思考下这个抽象工厂模式,看到该帖的各位,如果有更好的解释,也请给我大概说下,共同学习嘛

时间: 2024-12-27 20:30:39

java设计模式 -------- 创建模式 之 抽象工厂模式的相关文章

Java设计模式:Abstract Factory(抽象工厂)模式

概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品.换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品. 应用场景 客户端不需要知道它所创建的对象的类. 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况. 系统结构稳定,不会频繁地增加

Java设计模式菜鸟系列(五)抽象工厂模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403 抽象工厂模式(Abstract Factory):抽象工厂--顾名思义,就是把工厂抽象出来,不同的工厂生产不同的产品.这样做有个好处:一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码. 一.uml建模图: 二.代码实现 /** * 示例:抽象工厂--顾名思义,就是把工厂抽象出来,不同的工厂生产不同的产品 * * 优点:一旦需要增加新的功能,直接增加新的

Java设计模式(一) 简单工厂模式不简单

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/design_pattern/simple_factory 简单工厂模式使用案例 有一种抽象产品--汽车(Car),同时有多种具体的子类产品,如BenzCar,BMWCar,LandRoverCar.类图如下 作为司机,如果要开其中一种车,比如BenzCar,最直接的做法是直接创建BenzCar的实例,并执行其drive方法,如下 package com.

【C#设计模式——创建型模式】抽象工厂模式

抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种植物 编写一个基类Garden,Garden就是抽象工厂.它定义了具体类中的方法,并返回一系列相关类中的某个类. public class Garden { protected Plant center, shade, border; protected bool showCenter, showS

设计模式(三)抽象工厂模式(AbstractFactory)-创建型

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象.根据LSP原则,任何接受父类型的地方,都应当能够接受子类型.因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例.换言之,也就是这些抽象产品的具体子类的实例.工厂类负责创建抽象产品的具体子类的实例. 抽象工厂模式与工厂方法模式的区别

设计模式(3)抽象工厂模式(Abstract Factory)

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

原文地址:http://blog.chinaunix.net/uid-25958655-id-4243289.html 简单工厂模式 当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product 例如在大话设计模式P11给的运算工厂例子: public static Operation createOperate(string operate) { Operation oper = null; 12 switch (operate) { case "+":

简单工厂模式、工厂方法模式和抽象工厂模式-设计模式学习

1.简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象. 抽象产品(Product)角色 简单工厂模式所创建的所有

设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂