設計模式

設計模式

設計模式概述

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

設計模式分類

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

簡單的工廠模式

簡單工廠模式概述:

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

  • 優勢: 使用靜態工廠模式的優勢是實現責任的分割,該模式的核心是工廠類,工廠類含有必要的選擇邏輯,能夠決定何時建立哪個產品的實例,
    而客戶端則免去直接建立產品的責任,而僅僅是消費產品。也就是說靜態工廠模式在不改變客戶端代碼的狀況能夠動態的增長產品。
    明確了類的職責
  • 缺點
    這個靜態工廠類負責全部對象的建立,若是有新的對象增長,或者某些對象的建立方式不一樣,
    就須要不斷的修改工廠類,不利於後期的維護

    工廠方法模式

    工廠方法模式概述

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

  • 優勢
    客戶端不須要在負責對象的建立,從而明確了各個類的職責,若是有新的對象增長,
    只須要增長一個具體的類和具體的工廠類便可,不影響已有的代碼,後期維護容易,加強了系統的擴展性
  • 缺點: 須要額外的編寫代碼,增長了工做量安全

    單例模式之懶漢式

    單例設計模式之懶漢式

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

    (餓漢式)列:

    public class Student {
    //單例模式之,餓漢式
    private static Student student = new Student();運維

    //1.私有化構造
    private Student() {ide

    }this

    //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);

    }}

相關文章
相關標籤/搜索