一、設計模式六大原則
單一職責原則: adapter做適配的事 Bean做Bean的處理
開放封閉原則:像調用jar裏面的函數 模塊 只能用 不能改
里氏替換原則:像多態 子類可以複製給父類的引用 反過來 不行
依賴倒置原則:說了等於沒說
迪米特原則: 說了等於沒說
設計模式分爲三類:
創建類型模式:單例、工廠、建造者...
結構型設計模式:適配器、代理、橋接...
行爲型設計模式:策略、觀察者、迭代器...
1.單例模式
保證一個類只有一個實例,並提供一個全局訪問點 使用場景:項目中共享的數據 消耗資源多的對象 工具類對象
public class Singleton {
private Singleton(){
}
/*
* 餓漢模式 類加載時就完成初始化 獲取對象塊 沒有同步問題
*/
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
/*
* 懶漢模式
*/
private static Singleton instance2;
public static synchronized Singleton getInstance2(){
if(instance2==null)
instance2=new Singleton();
return instance2;
}
/*
* 雙重檢查模式 DCL
*/
private volatile static Singleton singleton3;
public static Singleton getInstance3(){
if(singleton3==null){
synchronized(Singleton.class){
singleton3=new Singleton();
}
}
return singleton3;
}
/*
* 靜態內部類
*/
public static Singleton getInstance4(){
return SingHolder.sholder;
}
private static class SingHolder{
private static final Singleton sholder=new Singleton();
}
}
2.簡單工廠模式
又名靜態工廠方法模式 這是由一個工廠對象決定創建出哪一種產品類的實例
(1) 抽象產品類
package factory;
public abstract class Computer {
/*
* 產品的抽象方法 由具體的產品類實現
*/
public abstract void start();
}
(2)具體產品類
package factory;
public class LenovoCom extends Computer{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("我是聯想計算機");
}
}
(3)工廠類
package factory;
public class ComFactory {
public static Computer createComputer(String type){
Computer mcomp=null;
if(type.equals("lenovo"))
mcomp=new LenovoCom();
else if(type.equals("huawei"))
mcomp=new Huawei();
return mcomp;
}
}
(2)客戶端調用工廠類
package factory;
public class MyComputer {
public static void main(String[] args) {
// TODO Auto-generated method stub
ComFactory.createComputer("lenovo").start();;
}
}
3.觀察者模式
即發佈-訂閱模式 在項目中經常使用的模式
(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");
}
}