設計模式(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);
}}