(java)ファクトリモードとポリシーモード

16785 ワード

工場モード
ファクトリモードは私たちが最もよく使うインスタンス化オブジェクトモードであり、new操作の代わりにファクトリメソッドを使用するモードです.工場モードはJavaプログラムシステムでは随所に見られると言える.ファクトリモードはインスタンスオブジェクトを作成するnewに相当するため、クラスClassに基づいてインスタンスオブジェクトを生成することがよくあります.例えば、A a=new A()ファクトリモードもインスタンスオブジェクトを作成するために使用されるので、後でnewするときは複数の心を持って、ファクトリモードを使用することを考慮することができますか.しかし、システムにより大きな拡張性とできるだけ少ない修正量をもたらします.
また、後述のコード修正の過程でエラーを低減するために、ファクトリで操作を完了する.

私たちはいつも計算機を知っているでしょう.計算機の加減乗除で説明します.
まず抽象的な操作クラスを定義します
           A B          getResult()                              
public abstract class Operation {

	private double numberA;
	
	private double numberB;
	
	public abstract double getResult();
	
	//  set get
	
}

加減乗除クラスを再定義するこれらのクラスはOperation抽象クラスを継承する
//     
public class OperatorAdd extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() + this.getNumberB();
		return result;
	}
}
//     
public class OperatorSub extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() - this.getNumberB();
		return result;
	}
}
//     
public class OperatorMul extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() * this.getNumberB();
		return result;
	}
}

//     
public class OperatorDiv extends Operation {
	@Override
	public double getResult(){
		if (this.getNumberB() == 0){
			try {
				throw new Exception("   0");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		double result = this.getNumberA() / this.getNumberB();
		return result;
	}
}

プラスとマイナスの乗除の機能はすべて書き終わって、私達は1つの計算の工場のクラスを書いて、要求の目標は1つの演算記号に入って必要な計算のクラスを返すことです
public static Operation createOperate(String operate) {
		Operation oper = null;
		switch (operate) {
		case "+":
			oper = new OperatorAdd();
			break;
		case "-":
			oper = new OperatorSub();
			break;
		case "*":
			oper = new OperatorMul();
			break;
		case "/":
			oper = new OperatorDiv();
			break;
		}
		return oper;
}

使用方法:
Operation oper = OperationFactory.createOperate("+");
oper.setNumberA(1);
oper.setNumberB(2);
System.out.println(oper.getResult());

上記は私たちが言った簡単な工場の基礎パッケージです.簡単に言えば、どんなタイプが必要ですか.私たちはもう自分でnew xxxx()を必要としません.何でも工場から取ります.
抽象工场については、少し少ないかもしれませんが、兴味があれば、自分でネットで见てみましょう.例を示します.
interface IProduct1 {  
    public void show();  
}  
interface IProduct2 {  
    public void show();  
}  
  
class Product1 implements IProduct1 {  
    public void show() {  
        System.out.println("  1   ");  
    }  
}  
class Product2 implements IProduct2 {  
    public void show() {  
        System.out.println("  2   ");  
    }  
}  
  
interface IFactory {  
    public IProduct1 createProduct1();  
    public IProduct2 createProduct2();  
}  
class Factory implements IFactory{  
    public IProduct1 createProduct1() {  
        return new Product1();  
    }  
    public IProduct2 createProduct2() {  
        return new Product2();  
    }  
}  
  
public class Client {  
    public static void main(String[] args){  
        IFactory factory = new Factory();  
        factory.createProduct1().show();  
        factory.createProduct2().show();  
    }  
}

ポリシー・モード
一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、互いに置き換えることができます.ポリシーモードは、アルゴリズムを使用する顧客とは独立して独立に変化させる.
まず抽象的なポリシークラスを定義します
public abstract class Strategy {

	public abstract void algorithmIterface();//    
}

環境クラスを定義します(Context)
public class Context {

	private Strategy strategy;
	public Context(Strategy strategy){
		this.strategy = strategy;
	}
	
	//     
	public void ContextInterface(){
		strategy.algorithmIterface();
	}
}

抽象的なポリシークラスがある以上、algorithmIterface()メソッドを継承して書き換えることができます.
public class ConcreteStrategyA extends Strategy {

	@Override
	public void AlgorithmIterface() {
		System.out.println("  A");
	}

}
public class ConcreteStrategyB extends Strategy {
	@Override
	public void AlgorithmIterface() {
		System.out.println("  B  ");
		
	}
}

使用方法:
public static void main(String[] args) {
		Context context = new Context(new ConcreteStrategyA());
		context.ContextInterface();
}

適用される場所
Strategyモードは、次の場合に使用します.
1)関連するクラスの多くは,行動が異なるだけである.ポリシーは、複数の動作のうちの1つの動作でクラスを構成する方法を提供します.すなわち、1つのシステムは、いくつかのアルゴリズムの中で動的に1つを選択する必要がある.
2)アルゴリズムの異なるバリエーションを使用する必要がある.たとえば、異なる空間時間のバランスを反映するアルゴリズムを定義することができます.これらのバリエーションがアルゴリズムのクラス階層として実装される場合、ポリシーモードを使用することができます.
3)アルゴリズムは顧客が知るべきでないデータを用いる.ポリシー・モードは、アルゴリズムに関連する複雑なデータ構造の暴露を回避するために使用することができる.
4)1つのクラスは複数の動作を定義し、これらの動作はこのクラスの動作において複数の条件文として現れる.条件文の代わりに、関連する条件分岐をそれぞれのStrategyクラスに移動します.
まとめ
シンプルなファクトリモデルも戦略モデルと組み合わせて使うことができ、興味があれば見てもいいです
要するに、他の人があなたのコードを迅速に理解できれば、良いコードです.コードの読み取り可能性は、設計モードを使用する必要はありません.
参照先:
  • 「大話設計モード」