首页 > 代码库 > java设计模式 -------- 创建模式 之 抽象工厂模式

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

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

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