設計模式——單例模式、建造者模式、觀察模式、代理模式

      設計模式分爲三類:

       創建類型模式:單例、工廠、建造者...

       結構型設計模式:適配器、代理、橋接...

       行爲型設計模式:策略、觀察者、迭代器...

 

   一.單例模式

      保證一個類只有一個實例,並提供一個全局訪問點   使用場景:項目中共享的數據 消耗資源多的對象 工具類對象

      特點:構造方法爲私有、提供一個靜態方法訪問該對象 

   

 

     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");
       
	}

}

 

 

 

 

 

 

 

 

 

 


 

 

 

    

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