您的位置:首页 > 编程语言 > Java开发

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

2017-04-25 19:22 155 查看

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


这个样例总感觉不太恰当,眼下我也在学习阶段。不是非常懂。随着学习设计模式的深入,等理解了再次来思考下这个抽象工厂模式,看到该帖的各位,假设有更好的解释。也请给我大概说下,共同学习嘛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: