首页 > 代码库 > 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设计模式 -------- 创建模式 之 抽象工厂模式