设计模式之工厂模式

现在我的感觉是,之所以花大力气,学习设计模式,主要是为了程序以后的扩展,而我也越来越意识到,程序扩展的重要性。而java之所以容易扩展主要得力与面向对象里的继承和多态。


今天写了个工厂模式实验代码,在此记下来,留着以后学习回忆。


工厂方法模式与简单工厂模式最大的区别在于: 简单工厂最大的优点在于,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态示例化相关的类,对于客户端来说,去除了与具体产品的依赖。(出自大话设计模式)


它的uml建模图据说是这样的 





第一次画建模图^_^


具体代码就在这里

package com.dic.simple.operation;
/**
 * 运算类顶级接口
 * 
 * 
 * @author roger.han([email protected])
 *
 */
public interface  Operation 
{
	/**
	 * 
	 * @param a
	 * @param b
	 */
	  public void operate(int a,int b);
   
}

package com.dic.simple.operation;

/**
 * 加法操作的具体实现
 * 
 * @author roger.han([email protected])
 *
 */

public class AddOperation implements Operation{


	/*
	 * (non-Javadoc)
	 * @see com.dic.simple.operation.Operation#operate(int, int)
	 */
	@Override
	public void operate(int a,int b) {
		// TODO Auto-generated method stub
		
		System.out.println(a+b);
		
	}

}

package com.dic.simple.operation;
/**
 * 乘法运算的具体实现
 * 
 * @author roger.han([email protected])
 *
 */
public class MultiplyOperation  implements Operation
{
    /*
     * (non-Javadoc)
     * @see com.dic.simple.operation.Operation#operate(int, int)
     */
	@Override
	public void operate(int a, int b) {
		// TODO Auto-generated method stub
		System.out.println(a*b);
	}
	
	
	

}



package com.dic.simple.factory;

import com.dic.simple.operation.AddOperation;
import com.dic.simple.operation.MultiplyOperation;
import com.dic.simple.operation.Operation;



/**
 * 简单工厂类 用于生成具体的操作对象 <span style="color:#ff0000;">具体生成对象的逻辑在简单工厂里实现</span>
 * 
 * @author roger.han([email protected])
 *
 */

public class SimpleFactory 
{
	/**
	 * 
	 * @param i 此处偷懒,0-->add 1-->multiply
	 * @return
	 */
	public static Operation getOperation(int i)
	{
		
		Operation oper;
		
		switch(i)
		{
		
		case 0:oper=new AddOperation();break;
		
		case 1:oper=new MultiplyOperation();break;
		
		default: return null;
		
		}
		
		return oper;	
		
	}
	

}


package com.dic.client;

import com.dic.simple.factory.SimpleFactory;
import com.dic.simple.operation.Operation;

/**
 * 简单工厂的调用客户端
 * @author roger.han([email protected])
 *
 */

public class SimpleClient 
{
	
	
	public static void main(String[] args)
	{
		
		Operation o=SimpleFactory.getOperation(1);
		o.operate(1, 2);
		
	}

}


抽象工厂的uml图据说是这样



代码是这样


package com.dic.factory;

import com.dic.simple.operation.Operation;
/**
 * 
 * 抽象工厂顶级接口类
 * 
 * 
 * 
 * @author roger.han([email protected])
 *
 */
public interface IFactory
{
   public Operation getOperation();
}



package com.dic.factory;

import com.dic.simple.operation.AddOperation;
import com.dic.simple.operation.Operation;
/**
 * 
 * 加法工厂 生产加法类
 * 
 * @author roger.han([email protected])
 *
 *
 *
 */


public class AddOperationFatory  implements IFactory{

	@Override
	public Operation getOperation() {
		// TODO Auto-generated method stub
		return new AddOperation();
	}

}

package com.dic.factory;

import com.dic.simple.operation.MultiplyOperation;
import com.dic.simple.operation.Operation;


/**
 * 
 * 乘法工厂 生产乘法法类
 * 
 * @author roger.han([email protected])
 *
 *
 *
 */



public class MultiplyOperationFactory implements IFactory {

	@Override
	public Operation getOperation() {
		// TODO Auto-generated method stub
		return new MultiplyOperation();
	}

}


package com.dic.client;


import com.dic.factory.IFactory;
import com.dic.factory.MultiplyOperationFactory;
import com.dic.simple.operation.Operation;
/**
 * 抽象工厂调用客户端
 * 
 * @author work
 *
 */
public class Client
{

	public static void main(String[] args)
	{
		
		IFactory  i=new MultiplyOperationFactory();//<span style="color:#ff0000;">而抽象工厂的逻辑在这里</span>
		
		Operation o=i.getOperation();
		
		o.operate(1,2);
		
		
	}
	
	
}



好了   终于把简单工厂和抽象工厂写完了  这时候如果想加个减法的话 简单工厂需要怎么做 而抽象工厂又需要怎么做


简单工厂要修改SimpleFactory的代码 还有客户端的代码 来获得减法类  ,抽象工厂又需要怎么做,它需要写一个新的工程 MinusFactory 来集成IIFactory实现产生运算累得方法

再客户端程序需要改下,具体的工厂。那个更好呢?老鸟是这么说的  简单工厂违背了开放封闭原则(软件实体《类,模块,函数等》应该可以扩展但不可已修改),但保持了封装对象创建过程的优点,这两种途径都是集中封装了对象的创建过程,使得更换对象时,不许要做大的改动就可以实现,降低了客户端程序域产品对象的耦合,抽象工厂模式是简单工厂模式的进一步抽象和推广(摘自大话设计模式)


老鸟是菜鸟进步的阶梯 再次感谢那些乐于分享经验的老鸟  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章