設計模式分爲三類:
創建類型模式:單例、工廠、建造者...
結構型設計模式:適配器、代理、橋接...
行爲型設計模式:策略、觀察者、迭代器...
一.單例模式
保證一個類只有一個實例,並提供一個全局訪問點 使用場景:項目中共享的數據 消耗資源多的對象 工具類對象
特點:構造方法爲私有、提供一個靜態方法訪問該對象
1.DCL模式(雙重檢查模式)
package com.single;
public class SingleMode {
private static volatile SingleMode sInstance;
private SingleMode() {
}
// DCL模式
public static SingleMode getInstance() {
if (null == sInstance) {
synchronized (SingleMode.class) {
if (null == sInstance) {
sInstance = new SingleMode();
}
}
}
return sInstance;
}
}
2.懶漢模式
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (null == instance) {
instance = new Singleton();
}
return instance;
}
}
3.餓漢模式
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
4.靜態內部類模式
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingleModeHolder.mInstance;
}
public static class SingleModeHolder {
private static Singleton mInstance = new Singleton();
}
}
二.建造者模式
將一個複雜的對象的構建與它的表示分離,使
得同樣的構建過程可以創建不同的表示。創建者模式隱藏了複雜對象的創建過程,它把複雜對象的創建過程加以抽象,通過子類繼承或者重載的方式,動態的創建具有複合屬性的對象。
特點:修改屬性不會從新創建對象
測試調用
package com.builder;
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClientLove love = new ClientLove.Builder()
.createName("曉")
.createBussiness("AI研究院")
.createPlace("深圳")
.build();
System.out.println(love.toString());
}
}
(2)具體產品類
package com.builder;
public class ClientLove {
/**
* 省略get set
*/
private String mName;
private String mBussiness;
private String mPlace;
public ClientLove(Builder builder) {
this.mName = builder.name;
this.mBussiness = builder.bussiness;
this.mPlace = builder.place;
}
public static class Builder {
public String name;
public String bussiness;
public String place;
public Builder createName(String cname) {
name = cname;
return this;
}
public Builder createBussiness(String cbussiness) {
bussiness = cbussiness;
return this;
}
public Builder createPlace(String cplace) {
place = cplace;
return this;
}
public ClientLove build() {
return new ClientLove(this);
}
}
@Override
public String toString() {
return "ClientLove [mName=" + mName + ", mBussiness=" + mBussiness + ", mPlace=" + mPlace + "]";
}
}
三.觀察者模式
即發佈-訂閱模式 在項目中經常使用的模式
(1)抽象觀察者
package observer;
public interface Observer {
//定義一個更新消息的方法
public void update(String message);
}
(2)具體觀察者
package observer;
public class UserWeixin implements Observer{
//微信用戶
private String name;
public UserWeixin(String name){
this.name=name;
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
System.out.println(name+" - "+message);
}
}
(3)抽象被觀察者
package observer;
public interface Subject {
/*
* 新增訂閱者
*/
public void attach(Observer observer);
/*
* 刪除訂閱者
*/
public void detach(Observer observer);
/*
* 通知訂閱者更新消息
*/
public void notify(String message);
}
(4)具體被觀察者模式
package observer;
import java.util.ArrayList;
import java.util.List;
public class SubscriptionSubject implements Subject {
//存儲訂閱公衆號的用戶
private List<Observer> userList=new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
// TODO Auto-generated method stub
userList.add(observer);
}
@Override
public void detach(Observer observer) {
// TODO Auto-generated method stub
userList.remove(observer);
}
@Override
public void notify(String message) {
// TODO Auto-generated method stub
for(Observer observer:userList){
observer.update(message);
}
}
}
(5)客戶端調用
package observer;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
SubscriptionSubject mssubject=new SubscriptionSubject();
//用戶
UserWeixin user1=new UserWeixin("鍾惠華");
UserWeixin user2=new UserWeixin("薛翠英");
UserWeixin user3=new UserWeixin("王大嬸");
//訂閱公衆號
mssubject.attach(user1);
mssubject.attach(user2);
mssubject.attach(user3);
//公衆號更新發消息給訂閱了的用戶
mssubject.notify("週末去小梅沙一浪 message");
//user1 走了 退訂了
mssubject.detach(user1);
//公衆號更新發消息給訂閱了的用戶
mssubject.notify("週末去浪啊 message");
}
}