本文是自己学习所做笔记,欢迎转载,但请注明出处: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