設計模式

設計模式

設計模式概述

設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。
使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性以及代碼的結構更加清晰.

設計模式分類

創建型模式(創建對象的): 單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。
行爲型模式(對象的功能): 適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
結構型模式(對象的組成): 模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、職責鏈模式、訪問者模式。

簡單的工廠模式

簡單工廠模式概述:

又叫靜態工廠方法模式,它定義一個具體的工廠類負責創建一些類的實例

  • 優點: 使用靜態工廠模式的優點是實現責任的分割,該模式的核心是工廠類,工廠類含有必要的選擇邏輯,可以決定什麼時候創建哪一個產品的實例,
    而客戶端則免去直接創建產品的責任,而僅僅是消費產品。也就是說靜態工廠模式在不改變客戶端代碼的情況可以動態的增加產品。
    明確了類的職責
  • 缺點
    這個靜態工廠類負責所有對象的創建,如果有新的對象增加,或者某些對象的創建方式不同,
    就需要不斷的修改工廠類,不利於後期的維護

    工廠方法模式

    工廠方法模式概述

    工廠方法模式中抽象工廠類負責定義創建對象的接口,具體對象的創建工作由繼承抽象工廠的具體類實現。

  • 優點
    客戶端不需要在負責對象的創建,從而明確了各個類的職責,如果有新的對象增加,
    只需要增加一個具體的類和具體的工廠類即可,不影響已有的代碼,後期維護容易,增強了系統的擴展性
  • 缺點: 需要額外的編寫代碼,增加了工作量

    單例模式之懶漢式

    單例設計模式之懶漢式

    開發中     餓漢式
    面試中     懶漢式
    
    面試就是想面試你們的兩種思想:
    
        a: 線程安全思想
        b: 延遲加載思想

    (餓漢式)列:

    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() {
    }

    //th1
    //2.提供一個公共的靜態方法,讓外界通過這個方法,去獲取一個該類的對象
    public synchronized static Teacher getTeacher() {

    if (teacher == null) {
        teacher = new Teacher();
        return teacher;
    }
    return teacher;

    }

}
public class MyTest {
public static void main(String[] args) {
Teacher teacher = Teacher.getTeacher();
Teacher teacher1 = Teacher.getTeacher();
System.out.println(teacher==teacher1);
}
}

模版設計模式

概述

模版方法模式就是定義一個算法的骨架,而將具體的算法延遲到子類中來實現

  • 優點和缺點
    • 優點: 使用模版方法模式,在定義算法骨架的同時,可以很靈活的實現具體的算法,滿足用戶靈活多變的需求
    • 缺點: 如果算法骨架有修改的話,則需要修改抽象類

      裝飾模式

      概述

      裝飾模式就是使用被裝飾類的一個子類的實例,在客戶端將這個子類的實例交給裝飾類。是繼承的替代方案

  • 優點和缺點

    • 優點
      使用裝飾模式,可以提供比繼承更靈活的擴展對象的功能,它可以動態的添加對象的功能,
      並且可以隨意的組合這些功能。
    • 缺點: 正因爲可以隨意組合,所以就可能出現一些不合理的邏輯。

      觀察者模式

      觀察者 = 訂閱者 + 發佈者
      崗位類 求職者 獵頭(註冊方法,註銷方法,發佈方法)

      列:

      public class HeaderHunter { //發佈者
      //定義兩個集合,一個集合用來存訂閱者,一個用來存工作崗位
      private ArrayList<WorkMan> workManArrayList = new ArrayList<>();
      private ArrayList<Job> jobArrayList = new ArrayList<>();

    //註冊
    public void regisiter(WorkMan man) {
    workManArrayList.add(man);
    }

    public void addJob(Job job) {
    jobArrayList.add(job);
    noticeToWorkman(job);
    }

    //通知
    public void noticeToWorkman(Job job) {
    for (WorkMan workMan : workManArrayList) {
    System.out.println(workMan.getName() + "你好!有一份" + job.getJobName() + "薪資 " + job.getJobMoney() + "歡迎你前去面試");
    }
    }

    //註銷
    public void removeMan(WorkMan man) {
    workManArrayList.remove(man);
    }
    public class Job {
    private String jobName;
    private double jobMoney;

    public Job(String jobName, double jobMoney) {
    this.jobName = jobName;
    this.jobMoney = jobMoney;
    }

    public String getJobName() {
    return jobName;
    }

    public void setJobName(String jobName) {
    this.jobName = jobName;
    }

    public double getJobMoney() {
    return jobMoney;
    }

    public void setJobMoney(double jobMoney) {
    this.jobMoney = jobMoney;
    }
    }
    public class WorkMan { //訂閱者
    private String name;

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

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    }
    public class MyTest {
    public static void main(String[] args) {

    WorkMan man1 = new WorkMan("玉藻前");
    WorkMan man2 = new WorkMan("不知火");
    WorkMan man3 = new WorkMan("搖鈴婆");
    WorkMan man4 = new WorkMan("妖刀姬");
    //在獵頭處註冊
    HeaderHunter headerHunter = new HeaderHunter();
    headerHunter.regisiter(man1);
    headerHunter.regisiter(man2);
    headerHunter.regisiter(man3);
    headerHunter.regisiter(man4);
    
    //一旦有工作過來,就會通知,每一個註冊過的人
    Job job1 = new Job("Java開發工程師", 15000);
    Job job2 = new Job("運維工程師", 16000);
    Job job3 = new Job("前端開發工程師", 12000);
    //把工作添加到獵頭處
    headerHunter.addJob(job1);
    System.out.println("---------------");
    headerHunter.addJob(job2);
    System.out.println("--------------------");
    headerHunter.addJob(job3);
    System.out.println("---------------------------");
    
    //註銷
    headerHunter.removeMan(man4);
    Job job4 = new Job("Python開發工程師", 12000);
    headerHunter.addJob(job4);

    }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章