Javaの研究ノート:デザインパターン

まず、デザインパターンと分類の概要

    1は、デザインパターンの概要
        デザインパターン(デザインパターン)カタログ、コード設計の経験の要約の後、ほとんどの人に知られている、使用を繰り返すように設定されています。
        再利用可能なコードに使用するデザインパターン、より容易に他人に理解コードを作成、ならびに明確コードのコード構造の信頼性を確保する。
   2、設計パターン分類
        スキーマ(オブジェクトの作成)を作成する:Singletonパターン、Abstract Factoryパターンを、 Builderパターン、工場出荷時のパターン、プロトタイプモデル。
        モデルのタイプ(オブジェクト関数):アダプタモード、ブリッジモード、装飾的なパターン、複合モード、外観モデル、フライ級、プロキシモード。
        構造モデル(オブジェクトから成る):テンプレートメソッドパターン、コマンドモード、イテレータパターン、オブザーバーパターン、仲介モデル、メモモード、インタプリタパターン、状態パターン、戦略パターン、デューティ鎖、ビジターパターン。

第二に、単純なファクトリパターンの概要と使用

    1.概要:また、具体的なファクトリクラスは、いくつかのクラスのインスタンスを作成するための責任がある定義する静的ファクトリメソッドパターンとして知られています。
    2、利点:静的ファクトリパターンを使用することの利点は、責任の分割を達成することで、モデルのコアは、ファクトリクラスであり、ファクトリクラスは、必要な選択ロジックを含む製品が作成され、クライアントは、直接から除去されたときの例を決めることができ製造物責任が、唯一の消費者向け製品を作成します。クライアントコードを変更せずにその静的工場パターンを動的に製品を追加することができます。それはクラスの責任を定義しました。
    3、短所:この静的ファクトリクラスは、すべてのオブジェクトを作成する役割があり、そこに新しいオブジェクトを追加することで、またはいくつかのオブジェクトを作成するためのさまざまな方法ならば、あなたは常にファクトリクラスを変更する必要があり、後半のメンテナンスを助長されていません。

       
第三に、ファクトリメソッド、および概要モードを使用して、

  1.概要:ファクトリメソッドパターン抽象ファクトリクラスは、特定のオブジェクトが抽象工場継承する具象クラスによって達成されるジョブを作成し、オブジェクトを作成するためのインタフェースを定義する責任があります。
  2、利点:クライアントは、新しいオブジェクトを追加することがある場合にのみ、既存のコードに影響を与えることができない特定のクラスとコンクリートのファクトリクラスを追加する必要があり、各クラスの責任を定義したオブジェクトを、作成を担当している必要はありません。 、後のメンテナンスが容易、システムのスケーラビリティ向上
  の追加のコーディングの必要性、ワークロードの増加:3、欠点
  4を、ケースプレゼンテーションを
    

第四に、シングルトン

   1、カテゴリ:怠惰と式式飢え
   2、および式飢え区別遅延式

单例模式之饿汉式
public class Student {
    private static Student student=new Student();
    //1.私有化构造
    private Student() {
    }
    //2.提供一个公共的静态方法,让外界通过这个方法,来获取一个该类的对象
    public static Student getStudent(){
        return student;
    }
}
测试类
public class MyTest {
    public static void main(String[] args) {
        Student student = Student.getStudent();
        Student student1 = Student.getStudent();
        System.out.println(student==student1);
    }
}
单例模式之懒汉式
public class Teacher {
    private static Teacher teacher=null;
    //1.私有化构造
    private Teacher() {
    }
    //2.提供公共的静态方法,让外界获取该类的一个对象
    //t1 t2
    public synchronized static Teacher getTeacher(){
        if(teacher==null){
            teacher=new Teacher();
        }
        return teacher;
    }
}
测试类
public class Test {
    public static void main(String[] args) {
        //懒汉式:体现的是一种延迟加载,当需要用的时候,我再帮你去创建这个对象
        //实际开发中 常用饿汉式
        Teacher teacher = Teacher.getTeacher();
        Teacher teacher1 = Teacher.getTeacher();
        System.out.println(teacher==teacher1);
    }
}

3つの2アイデア、シングルトン:
             A:思想スレッドセーフ
             B:ローディング遅延が考え
4、シングルトンクラスのJavaコードは、ランタイムを具現化

   A、ランタイムクラスの概要:各アプリケーションは、その事業者に接続されている環境へのアプリケーションのJavaランタイムクラスのインスタンスを持っています。あなたは、getRuntimeメソッドにより、現在のランタイムオブジェクトを取得することができます。アプリケーションは、クラスランタイムの独自のインスタンスを作成することはできません。 
   B、ケースプレゼンテーション:公共プロセスのexec(stringコマンド) // DOSコマンドの実行

public class Demo {
    public static void main(String[] args) throws IOException {
        //这个类,采用的是单例模式之饿汉式
        Runtime runtime = Runtime.getRuntime();
        //Process exec (String command)
        //在单独的进程中执行指定的字符串命令。
        //runtime.exec("calc");//打开计算机
        //runtime.exec("mspaint");//打开画图
        //runtime.exec("notepad");//打开记事本
        //定时关机
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    runtime.exec("shutdown -s -t 0");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, 1000 * 60 * 1);
    }
}

第五に、使用テンプレートとデザインパターンの概要

    1概要:Template Methodパターンは、骨格のアルゴリズムを定義すること、およびサブクラスに特異的なアルゴリズム遅延を達成するために、    
    図2に示すように、条件:ループ実行のための時間計算 
    アルゴリズム骨格の定義で、ステンシル法モード:3つの利点を同時に、ユーザー柔軟のニーズ満たすために特定のアルゴリズムを達成するのは非常に柔軟であることができ   
    、アルゴリズムがスケルトンを変更した場合、その後、あなたは抽象クラスに変更する必要があります。4不利益を    
    使用テンプレートのデザインパターン:5、ケースプレゼンテーションを

public abstract class CalcTime {
    public long testTime() throws IOException {
        long start = System.currentTimeMillis();
        testTimer();
        long end = System.currentTimeMillis();
        return  end-start;
    }
    public abstract void testTimer() throws IOException;
}
public class TestFor extends CalcTime{
    @Override
    public void testTimer() {
        for (int i = 0; i < 1000; i++) {
                   System.out.println(i);
                }
    }
}
public class MyTest {
    public static void main(String[] args) throws IOException {
        CalcTime testFor = new TestFor();
        long l = testFor.testTime();
        System.out.println("耗时" + l + "毫秒");
    }
}

 

第六に、装飾的なパターンと概要の使用

   1概要:装飾的なパターンは、装飾的な終わりに装飾、このサブクラスのクライアント・インスタンスのサブクラスのインスタンスによって使用されています。継承された別の
   二つの利点:装飾的なパターンの使用は、動的オブジェクト関数を追加することができ、拡張オブジェクト継承機能、より柔軟提供することができ、これらの機能は、自由に組み合わせることができます。
   3、短所:あなたが自由に混在させることができるからといって、それは無理なロジックを表示される場合がありますので。

七のオブザーバーモードと使用の概要

 1:ケース:仕事を見つけるためにヘッドハンターを見つける
 2:加入者オブザーバ= +出版社の
         求職者の検索クラス(登録方法、キャンセル方法、配布方法)

public class HeaderHunt { //猎头
    //定义两个集合,来装求职者,和工作岗位
    private ArrayList<Worker> mans=new ArrayList<>();
    private ArrayList<Job> jobs = new ArrayList<>();
    //提供注册的方法
    public void addMan(Worker man){
        mans.add(man);
    }
    //提供注销的方法
    public void removeMan(Worker man){
        mans.remove(man);
    }
    //添加岗位
    public void addJob(Job job){
        jobs.add(job);
        //岗位一旦有了之后,我就得通知每一个求职着
        noticeToMan(job);
    }
    //通知的方法
    private void noticeToMan(Job job) {
        for (Worker man : mans) {
            System.out.println(man.getName()+"你好! 有一份"+job.getName()+"月薪"+job.getMoney()+"诚邀你前去面试");
        }
    }
}
public class Job {
    private String name;
    private double money;

    public Job() {
    }

    public Job(String name, double money) {
        this.name = name;
        this.money = money;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}
public class Worker {
    private String name;

    public Worker() {
    }

    public Worker(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
测试类
public class Test {
    public static void main(String[] args) {
        Worker man1 = new Worker("张三");
        Worker man2 = new Worker("李四");
        Worker man3 = new Worker("王五");
        Worker man4 = new Worker("赵六");
        //把每个人的信息注册到猎头那里
        HeaderHunt headerHunt = new HeaderHunt();
        headerHunt.addMan(man1);
        headerHunt.addMan(man2);
        headerHunt.addMan(man3);
        headerHunt.addMan(man4);
        //猎头一旦工作岗位更新后 ,就会通知每一个求职者
        headerHunt.addJob(new Job("软件开发工程师",25000));
        headerHunt.removeMan(man3); //移除求职着
        System.out.println("----------------------------");
        headerHunt.addJob(new Job("大数据工程师", 35000));
    }
}

 

公開された24元の記事 ウォン称賛11 ビュー2047

おすすめ

転載: blog.csdn.net/weixin_43791069/article/details/86697191