【設計モード】工場モード反射技術を組み合わせたシンプルな応用


工場パターン概要:
工場モードは主にオブジェクトを作成するための遷移インターフェースを提供し、オブジェクトを作成する具体的なプロセスを遮蔽し、柔軟性を高める目的を達成する。工場モデルは三つの種類があります。シンプル工場(simple factory)、多形工場(factory method)、抽象工場(abstractory)。工場モデルに慣れていないなら、もう一つのブログを参照してください。http://blog.csdn.net/rowandjj/article/details/8785050を選択します
 
以下は今回のテーマに入ります。
私達が実際にプロジェクトを開発する時、あるインターフェースに対して異なる実現方法があるかもしれません。あるいは、プロジェクトの需要が変わる時、私達はインターフェースに対して新たな需要を満たすために再実現しなければなりません。この時、私達は多形の特性を十分に利用して、新しい実現類に引用します。このようにコードを数行修正すればいいですが、プロジェクトが十分大きいと、コードが何万行に達しますか?しかも、一箇所だけでなく、修正が必要となると、私達の仕事は面倒になります。またミスが発生しやすいと想像しています。だからソースコードの修正を提案しません。コードをできるだけ少なく修正した上で、この仕事を完成させるにはどうすればいいですか?反射はクラス名でクラスの実例を構築することができると考えています。私達はクラス名を一つの構成ファイルの中にキーとして保存してもいいです。修正が必要な場合、キーの対応する値を修正すればいいです。かっこいいですか?
次は簡単な例を通して実現します。
まず一つのインターフェースとその二つの実装クラスを定義します。
package factory;

public interface Car
{
	public void drive();
}
実現クラス1:
package factory;

public class CarImpl01 implements Car
{
	@Override
	public void drive()
	{
		// TODO          
		System.out.println("this is a benz car");
	}
}
実現クラス2:
package factory;

public class CarImpl02 implements Car
{
	@Override
	public void drive()
	{
		// TODO          
		System.out.println("this is a bmw car");
	}
}
 
次のポイントに来ました。プロジェクトの下に配置ファイルを新たに作成します。ファイルの中でこのようなキーの値を定義します。
carImplName = factory.CarImpl01
 
次に、車を作るために工場を作ります。
package factory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Factory
{
	private static Car car = null;
	private static Factory instance = new Factory();
//	             ,          (         )
	private Factory()//  
	{
		String filename = "src\\factory\\CarImpl.properties";
		InputStream inStream = null;
		try
		{
			inStream = new FileInputStream(new File(filename));
			Properties prop = new Properties();
			prop.load(inStream);
			String className = prop.getProperty("carImplName");
			car = (Car)Class.forName(className).newInstance();
		}
		catch (FileNotFoundException e)
		{
			// TODO       catch  
			e.printStackTrace();
/*
          ,                         
*/
		}
		catch (IOException e)
		{
			// TODO       catch  
			e.printStackTrace();
		}
		catch (InstantiationException e)
		{
			// TODO       catch  
			e.printStackTrace();
		}
		catch (IllegalAccessException e)
		{
			// TODO       catch  
			e.printStackTrace();
		}
		catch (ClassNotFoundException e)
		{
			// TODO       catch  
			e.printStackTrace();
		}
		
	}
	public static Factory getInstance()
	{
		return instance;
	}
	
	public Car buildCar()
	{
		return car;
	}
}
 
はい、成功しました。機能を試してみましょう。
package factory;

public class Main
{
	public static void main(String[] args) 
	{
		// TODO          
		Car car = Factory.getInstance().buildCar();//    Factory     !
		car.drive();
		
	}

}
 
今はCarImpl 02オブジェクトを生成したいです。コードを変更する必要はありません。先ほどの設定ファイルを注釈してください。このように:
#carImplName = factory.CarImpl01

carImplName = factory.CarImpl02
便利ですか?