zoukankan      html  css  js  c++  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

          这个样例总感觉不太恰当,眼下我也在学习阶段。不是非常懂。随着学习设计模式的深入,等理解了再次来思考下这个抽象工厂模式,看到该帖的各位,假设有更好的解释。也请给我大概说下,共同学习嘛
  • 相关阅读:
    js--script和link中的 integrity 属性
    html之aria-hidden="true"
    S-HR之导入模板校验非当天变更限制
    拆分字符串
    S-HR之变动操作,变动原因,变动类型/离职操作,离职原因,离职类型
    mysql数学函数
    html页面引入
    springboot之server属性
    【开发工具】-Idea代码提示忽略大小写
    【个人提升】-怎样获得技术的成长(转)
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6763848.html
Copyright © 2011-2022 走看看