Javaデザインモード:ジェネレータモード

6209 ワード

問題の提出:
いくつかのクラスは、オブジェクトを作成しやすく、その構造方法、例えば、Student student=new Student(「1001」、「zhang」、21)を直接呼び出します。 作成が容易な理由は、そのクラスのメンバーは基本的なデータタイプまたはパッケージクラス、または文字列であるからである。ただし、対象のクラスのメンバーがまだ対象である場合、このオブジェクトを作成するには、その対象メンバーの具体的なオブジェクトを生成する必要があります。
public class Unit1 {
}
public class QuestionProduct {
    Unit1 u1;
    Unit2 u2;
    Unit3 u3;    public void createUnit1(){
        u1 = new Unit1();
    }    public void createUnit2(){
        u2 = new Unit2();
    }    public void createUnit3(){
        u3 = new Unit3();
    }    public void composite(){

    }    public static void main(String[] args) {
        QuestionProduct p = new QuestionProduct();
        p.createUnit1();
        p.createUnit2();
        p.createUnit3();
        p.composite();
    }
}
 
Unit 123は各java対象であり、mainではp.com mposit()メソッドを実行した後に、Productが本当に作成されました。問題が来ました。もし二つのProductオブジェクトがあれば、多くの種類のメンバーがいるかもしれません。またあるいはProductの製品種類の増加と減少に従って、既存のソースコードを修正しなければなりません。このような問題を解決するために、ジェネレータモードが生まれました。
生成器モードの主な考え方は、同じ構築プロセスが異なる表現を作成することができるように、複雑な構築を表現と分離することである。簡単に言えば、同じクラスの中でこのクラスのクラスのメンバーを作成するのではなく、クラスのメンバーの作成を別のクラスに渡します。このクラスをジェネレータといいます。
public interface IBuild {    public Product create();
}
public class BuildProduct implements IBuild {
    Product p = new Product();    public void createUnit1(){        //  u1    }    public void createUnit2(){        //  u2    }    public void createUnit3(){        //  u3    }    public Product composite(){        //  Unit1,Unit2,Unit3
        return p;
    }    public Product create(){
        createUnit1();
        createUnit2();
        createUnit3();        return composite();
    }
}
上のコードから分かるように、需要分析が変化したら、対応するジェネレータ種類のBuildProductを追加または削除すればよく、既存のクラスコードを修正する必要はない。
この基礎の上で、もう一つのスケジューリングクラスを定義するのは、ジェネレータインターフェースに対するIBuildのパッケージです。
public class Director {    private IBuild iBuild;    public Director(IBuild iBuild){        this.iBuild = iBuild;
    }    public Product build(){        //System.out.println("test");        iBuild.createUnit1();
        iBuild.createUnit2();
        iBuild.createUnit3();        return iBuild.composite();
    }    public static void main(String[] args) {
        IBuild iBuild = new BuildProduct();
        Director director = new Director(iBuild);
        Product p = director.build();
    }
}
これでジェネレータモードの一般モードを構成します。普通は次の3つのステップに分けられます。
1)製品類を定義する
2)nジェネレータBuildクラスを定義する
3)統一したスケジューリングクラスのDirector類を定義する。
Directorについての理解:従来のインターフェースに比べて、生成器インターフェースIBuildは特別であり、フロー制御インターフェースである。このインターフェースで定義された方法は、ある順序で実行しなければならず、一つも欠かせない。そのため、プログラムの中の一つは「流れ」という特徴を表しています。Director類の役割は「プロセス」のパッケージ類であり、その中のbuild方法は具体的なプロセス制御過程を決定している。
上のジェネレータモードに対して、2つのプロダクトを生成するには、3つのプロセスが必要であり、1つは4つのプロセスが必要である。上のジェネレータモード(Model 1)ではいけない。これは製品を作成する過程が同じである必要があるからである。それで次のModel 2のデザインを引き起こしました。
Model 2:IBuildインターフェースは多状態create()方法のみを定義します。
public interface IBuild {    public Product create();
}
 具体的なジェネレータクラスで多形質create()方法を書き換え、複数の非多形方法を呼び出し、最終的にプロジェクトオブジェクトに戻る。
public class BuildProduct implements IBuild {
    Product p = new Product();    public void createUnit1(){        //  u1    }    public void createUnit2(){        //  u2    }    public void createUnit3(){        //  u3    }    public Product composite(){        //  Unit1,Unit2,Unit3
        return p;
    }    public Product create(){
        createUnit1();
        createUnit2();
        createUnit3();        return composite();
    }
}
ディレクター類
public class Director {    private IBuild iBuild;    public Director(IBuild iBuild){        this.iBuild = iBuild;
    }    public Product build(){        return iBuild.create();
    }
}
コードを詳しく分析すると、具体的なジェネレータの多状態create()方法にはプロジェクトオブジェクトを作成する全過程が含まれており、Director類では方法が重複していることが分かります。このような設計ではDirector類は省略できますが、これはジェネレータモードにおいて抽象的なジェネレータと具体的なジェネレータが必要であることを示しています。
指揮類は実際の問題の中で真剣に考慮し、取捨選択する必要があります。さらに考えてみると、IBuildをパンチングインターフェースと定義することができ、Product製品だけでなく、他の必要なジェネレータのマジックの製品もこのインターフェースから派生することができます。
 
以上の2つの実装に加えて、第3のジェネレータ機能の設計モードがあります。
Model 3:Product派生方法を利用して、類似のジェネレータ機能を実現できます。
具体的なコードは以下の通りです
1.プロジェクト類
 View Code
2.ジェネレータBuildProduct類
 View Code
3.指揮者類Director
 View Code
要するに、生成器モードが複製オブジェクトを作成する場合、主な原則はオブジェクト構築プロセスと表示分離である。これは一つの全体的な思想であり、具体的な形式を実現することは一定不変ではなく、自分の専属的なジェネレータモデルフレームを大きく設計することができる。重要なのは思想であって、形式を実現するのではない!
 
最後に、ジェネレータモードの応用シーンについて話します。その中の一つの重要な役割は、同じ流れ、異種界面を解決する手段の一つです。
例えば登録すると、教務システムの登録によって教師と学生が区別されます。一般的なアプリケーションは管理者と一般ユーザーにも分けられます。異なるキャラクターを登録したり、異なるページを表示したりします。教育管理システムのこの例について簡単に説明します。
        
学生の具体的な情報はstudent表の中で、教師の具体的な情報はteacher表の中にあります。管理者は学生と教師のために、ユーザー名とアカウントをloginテーブルに割り当て、studentとteacherテーブルにキーワードuserの記録を作成します。しかし、他の具体的な情報は氏名年齢などが空いています。
学生や教師が登録したらまず個人情報を改善する必要があります。以下は、ジェネレータモードを利用した「個人情報の充実」の基礎コードです。
 Mysql表のシンプルなデザイン
 View Code
1)インターフェース抽象生成器UBuider
package BuildModel.Example;import javax.swing.*;/**
 * Created by lenovo on 2017/4/18. */public abstract class UIBuilder {    protected JPanel panel = new JPanel();    abstract public void addUI();                   //    
    abstract public void registerMsg();             //    
    abstract public void initialData(String user);  //       
    public JPanel getPanel(){                       //        
        return panel;
    }
}
2)具体的な学生インターフェース生成器類StudentBuider
 View Code
3)DbProcデータベースのカスタムパッケージ類(テスト時のstrPwdは自分のローカルmysqlのアカウントパスワードを追加することに注意する)
 
 View Code
 
4)具体的な教師インターフェースジェネレータTecher Buider(類似しています。ここでは書きません。)
5)プロセス指揮類Director
package BuildModel.Example;import javax.swing.*;/**
 * Created by lenovo on 2017/4/18. */public class Director {    private UIBuilder builder;    public Director(UIBuilder builder){        this.builder = builder;
    }    public JPanel build(String user){
        builder.addUI();                //     
        builder.registerMsg();          //    
        builder.initialData(user);      //     user         
        return builder.getPanel();
    }
}
6)試験類
 View Code
もちろんこれは簡単なテストコードです。実際の応用には多くの問題に注意しなければなりません。