JAva設計モードの単例モード、工場モード

26884 ワード

JAva設計モードの単例モード、工場モード、抽象工場モード
ここ数日javaの3つのモードに関する論文をたくさん見ました.次は数の中の奇数と偶数を探して、彼らを分けて、MVCのアーキテクチャ設計思想を表現します.単例モード:単例はその名の通り単例という意味です.この特定のモノマークラスは、1つのインスタンスしか作成できず、クラス内のメソッドによって他のクラスに参照されます.単一でしか実行できないプログラムによく適用されます.例えば、券売機、プリンタは、一度に1つのインスタンスしか運用できず、単独で実行できます.場合によっては二義性を避けることができます.単体を運用するのも、プログラムが実行中にメモリを消費する大きさを高め、利用の効率を高め、より安全で、実行コードを節約するためである.単例モデルを用いる最も核心的な点は,オブジェクト向けパッケージ特性における「単一職責」と「オブジェクト自治」の原則を体現することである.1つのアプリケーションに1部だけ保持すればよい場合に適用され、リソースを節約し、管理を容易にします.
単体の実現形式は怠け者式と餓呼式があり、その違いは以下の通りである:重量級オブジェクトに餓漢モードを適用し、クラスロード時の速度は遅いが、運行時の速度は速い;怠け者モードでは逆に、クラスのロード時には速度が速いが、実行時に初めてオブジェクトを取得する速度は遅い.
単体コード
import java.util.*;

//                           

public class Singleton_Distinguish{
    private List  odd,even;//    ,odd     ,even     
    private static volatile Singleton_Distinguish Singleton=null;//            
    public Singleton_Distinguish(){
    }
    public void Distinguish(List L){
      if(odd==null)
        odd=new ArrayList();//                   
      if(even==null)
        even=new ArrayList();//                   
      for(int i=0; i//    
        if((int)L.get(i)%2==0){//      2,        
          even.add(L.get(i));
        }else{
          odd.add(L.get(i));
        }
      }
    }
    public static Singleton_Distinguish getSingleton(){ //          
      if(Singleton==null){
        synchronized(Singleton_Distinguish.class){//        
          if(Singleton==null){//             
            Singleton=new Singleton_Distinguish();
          }
        }
      }
      return Singleton;
    }
    public List getOdd(){//     
      return odd;
    }
    public List getEven(){//     
      return even;
    }
    public void ShowOdd(){//     ,         
      System.out.println("the odds is:");
      for(int i=0;iout.print(odd.get(i)+" ");
      }
        System.out.println("");
    }
    public void ShowEven(){
      System.out.println("the even is:");
      for(int i=0;iout.print(even.get(i)+" ");
      }
      System.out.println("");
    }
}

餓漢式の実現方法
import java.util.*;


public class Singleton_Distinguish{
    private List  odd,even;//    ,odd     ,even     
    private static volatile Singleton_Distinguish Singleton=new Singleton_Distinguish();
    public Singleton_Distinguish(){

    }
    public void Distinguish(List L){
      if(odd==null)
        odd=new ArrayList();
      if(even==null)
        even=new ArrayList();
      for(int i=0; iif((int)L.get(i)%2==0){
          even.add(L.get(i));
        }else{
          odd.add(L.get(i));
        }
      }
    }
    public static Singleton_Distinguish getSingleton(){
      return Singleton;
    }
    public List getOdd(){
      return odd;
    }
    public List getEven(){
      return even;
    }
    public void ShowOdd(){
      System.out.println("the odds is:");
      for(int i=0;iout.print(odd.get(i)+" ");
      }
        System.out.println("");
    }
    public void ShowEven(){
      System.out.println("the even is:");
      for(int i=0;iout.print(even.get(i)+" ");
      }
      System.out.println("");
    }
}


SingletonMain
import java.io.*;
import java.util.*;
import java.util.Scanner;

public class SingletonMain{
  public static void main(String []args){
    int n;
    List numberList=new ArrayList();
    Scanner in=new Scanner(System.in);
    System.out.println("             ");
    n=in.nextInt();
    System.out.println("        ");
    for(int i=0;iin.nextInt());
    }
    Singleton_Distinguish SingleExample=Singleton_Distinguish.getSingleton();
    SingleExample.Distinguish(numberList);
    SingleExample.ShowOdd();
    SingleExample.ShowEven();
  }
}

単一例の利点:
             。              ,                    ,                 。
               ,          ,                ,               。
         。              ,                        。

単一例の欠点:
            ,              。
        ,         “      ”。             ,       ,          ,        ,                    。
             ,                      ,                         ;          ( Java、C#)                  ,  ,               ,         ,          ,            ,           。

適用環境:
           ,                  ,                      。
                      ,        ,             。
                           。   ,              ,            ,        

シンプルなファクトリモード:
モードが提案した動機:人々が設計するために必要なコントロールはすべて1つの蓄積から来ているが、コントロールの属性の違いによって彼らに異なる外観と作用をもたらした.これらのコントロールを使用するときに、より便利な呼び出し方法があり、入力されたパラメータに基づいて対応するコントロールオブジェクトが得られることを望んでいます.
単純なファクトリは、他の製品クラスの作成を担当するクラス(Factory)が特別に定義されているインスタンスです.
パターンの構造:Factory,Product,ConcreteProduct.
製品類の実現(ここではMVCの設計アーキテクチャを採用し、主にファイル分けのアーキテクチャ思想を育成するためである.
NumberX抽象クラス、抽象製品(Model)
package NumberModel;
import java.util.*;

public abstract class NumberX{
  public abstract List  GetNumberList();//          
  public abstract boolean GetType();//                ,  FALSE   ,  TURE   
}

Evennumberクラス、奇数サブクラス、具体的な製品クラス(Model)
package NumberModel;
import java.util.*;
import java.lang.Integer;

public class EvenNumber extends NumberX{
  private ArrayList  EvenList=null;

  public EvenNumber(){
    EvenList=new ArrayList();
  }
  @Override
  public List GetNumberList(){
    return EvenList;
  }
  @Override//                ,        
  public  boolean GetType()
  {
    return true;
  }
}

OddNumberクラス、偶数サブクラス、具体的な製品クラス(Model)
package NumberModel;
import java.util.*;
import java.lang.Integer;

public class EvenNumber extends NumberX{
  private ArrayList  EvenList=null;

  public EvenNumber(){
    EvenList=new ArrayList();
  }
  @Override
  public List GetNumberList(){
    return EvenList;
  }
  @Override//                ,        
  public  boolean GetType()
  {
    return true;
  }
}

NumberViewクラスは、特定の製品クラスの情報をビューとして表示する(View)
“` package NumberView; import java.util.*; import NumberModel.*;
public class Number View//ビュークラスpublic void ShowNumber(NumberX NumbberExample){//選択数を表示するためのデジタルリストリスト=NumbberExample.GetNumbberList();//Listは、宣言として数列if(NumbberExample.GetType(==true)System.out.println("the Evens:");else System.out.println("the odds is:");for(int i=0;i;i
package NumberController;
import java.util.*;
import java.lang.Integer;
import NumberModel.*;
import NumberView.*;

public  class NumberController{
    private NumberX NumberEx=null;//NumberEx      number    
    private NumberView View=null;//View      NumberView    
    public NumberController(NumberX Nu,NumberView vi){//        
    NumberEx=Nu;//              
    View=vi;//                
    }
    public NumberController(NumberX Nu){//        
    NumberEx=Nu;//              
    }
    public  boolean IsThisNumber(Integer i)//          
    {
      if(NumberEx.GetType()==true){
          if(i%2==0)return true;//     ,      
          else return false;
      }else{
        if(i%2==0)return false;
        else return true;
      }
    }
    public  void  AddNumber(Integer i){//           
      List NumberList=NumberEx.GetNumberList();//                
      NumberList.add(i);
    }
    public void clear(){//           
      List NumberList=NumberEx.GetNumberList();//                
      NumberList.clear();
    }
    public void ChangeNumber(NumberX NumberDate){
      NumberEx=NumberDate;
    }
    public void ShowNumberView(){
      if(View!=null)
        View.ShowNumber(NumberEx);//        
    }
    public NumberX GetNumber(){
      return NumberEx;
    }
}

ユーザーのニーズに応じて対応する製品クラスを返す専用のファクトリクラス
package simpleFactory;

import java.util.*;
import NumberController.*;
import NumberModel.*;

public class simpleFactory{
  private EvenNumber EvenNum;
  private OddNumber OddNum;
  public simpleFactory(){
    OddNum=new OddNumber();
    EvenNum=new EvenNumber();
  }
  public NumberX NumberDistinguish(List  L,int type){
    NumberController controller;
    if(type==0)
       controller=new NumberController(OddNum);
    else
       controller=new NumberController(EvenNum);
    controller.clear();
     for(int i=0; iif(controller.IsThisNumber(L.get(i))){
         controller.AddNumber(L.get(i));
       }
     }
  return controller.GetNumber();
  }
}

SimpleFactoryMainクラス、プログラムを実行する
import java.io.*;
import java.util.*;
import NumberView.*;
import NumberController.*;
import NumberModel.*;
import simpleFactory.*;

public class simpleFactoryMain{
  public static void main(String []args){
    int n;
    List numberList=new ArrayList();
    Scanner in=new Scanner(System.in);
    System.out.println("             ");
    n=in.nextInt();
    System.out.println("        ");
    for(int i=0;iin.nextInt());
    }
    NumberX L;//L Number           
    simpleFactory f= new simpleFactory();
    NumberView view = new NumberView();
    L=f.NumberDistinguish(numberList,0);
    view.ShowNumber(L);
    L=f.NumberDistinguish(numberList,1);
    view.ShowNumber(L);
  }
}

前の例では、simpleFactoryのNumberDistingguish(List L,int type)メソッドは、入力されたチェーンテーブルパラメータとデータ型パラメータを対応するデジタルクラス(製品)に返すことである.
            ,                    ,        ,                             ,               。                ,        ,          。             。

工場モード
パターンの生成:
特定のコントロールの作成を特定のファクトリ・サブクラスに渡す必要があります.製品を追加するたびに、または削除するたびに、特定のファクトリ・クラスを変更する必要がないようにします.新しい製品が発生した場合は、特定のファクトリ・クラスを作成して製品を生成する必要があります.開閉の原則に従います.
パターン構造:
Product:    
ConcreteProduct:    
Factory:    
ConcreteFactory:    

抽象ファクトリクラスの実装:
import java.util.*;
import java.lang.Integer;

abstract class Factory{ //    ,             
   public abstract Number NumberDistinguish(List );
}

具体的な工場類
偶数ファクトリクラス
import java.util.*;
import java.lang.Integer;

public class EvenFactory extends Factory{
  @Override
  public Number NumberDistinguish(List  list){ //       
    EvenNumber EL=new EvenNumber();//          
    NumberController controller =new NumberController(EL);//                 
    for(int i=0;i

奇数工場類
import java.util.*;
import java.lang.Integer;

public class OddFactory extends Factory{
  @Override
  public Number NumberDistinguish(List  list){ //       
    OddNumber OL=new OddNumber();//          
    NumberController controller =new NumberController(OL);//                 
    for(int i=0;i

FactoryMainクラスはプログラムを実行します..
import java.util.*;

public class FactoryMain{
  public static void main(String []args){
  int n;
  List numberList=new ArrayList();
  Scanner in=new Scanner(System.in);
  System.out.println("             ");
  n=in.nextInt();
  System.out.println("        ");
  for(int i=0;iin.nextInt());
  }
  Number N=new Number();
  N=EvenFactory(numberList);
  N.ShowNumber();
  N=OddFactory(numberList);
  N.ShowNumber();
}
}

ファクトリメソッドモードでは、ファクトリメソッドは、顧客が必要とする製品を作成するために使用されます.また、どの特定の製品クラスがインスタンス化されるかという詳細も顧客に隠します.ユーザーは、必要な製品に対応するファクトリに関心を持つだけで、詳細の作成に関心を持つ必要はありません.また、道具の製品クラス名を知る必要もありません.ファクトリロールと製品ロールに基づくマルチステート設計は、ファクトリメソッドモデルです.式のキーです.工場がどの製品オブジェクトを作成するかを自主的に決定し、どのようにこのオブジェクトを作成するかの詳細を特定の工場内に完全にカプセル化できます.