做者:haibiscuitgit
時間:2019:3:13github
您的star是我不斷前行的動力數據庫
https://github.com/haibiscuit設計模式
轉載請說明出處服務器
前言:框架
1.能夠先參考我寫的設計原則,總的來講最重要的是要以單一職責和抽象和接口來設計本身的類,ide
其中單一原則(應該僅有一個引發它變化的緣由),以及模式設計的可擴展性尤其重要。測試
2.爲了達到開閉原則,能夠將要使用的類的路徑配置在xml中,利用反射獲取類的實例,另外須要配置的類在每一個模式中只須要配置一種,ui
例如:spa
工廠模式:只須要配置工廠的實現類,目標類(即工廠建立的類在工廠的是喜好呢類中建立)
適配器模式:只須要配置適配器類,適配者在適配器類中建立,由適配器來操做
另外,設計模式是爲了創建不一樣類型的類之間的關係
例如:
工廠模式的工廠類和目標生成類(這裏工廠模式有接口)
適配器模式的適配者類和適配器類(這裏適配器類也有接口)
因此,上面的設計模式總結的思路很值得在實際的代碼設計中使用
目錄:
建立型:(重點推薦工廠模式和單例模式)
1.工廠模式
2.抽象工廠模式
3.單例模式
結構性:(重點推薦適配器模式和代理模式)
1.適配器模式
2.外觀模式
3.代理模式
行爲型:(重點推薦策略模式和觀察者模式)
1.命令模式
2.迭代器模式
3.策略模式
4.觀察者模式
一:工廠模式
定義:定義一個用於建立對象的接口,可是讓子類決定將哪個類實例化。工廠方法模式讓一個子類的實例化延遲到其子類。
使用場景:1、日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶能夠選擇記錄日誌到什麼地方。 2、數據庫訪問,當用戶不知道最後系統採用哪一類數據庫,以及數據庫可能有變化時。 3、設計一個鏈接服務器的框架,須要三個協議,"POP3"、"IMAP"、"HTTP",能夠把這三個做爲產品類,共同實現一個接口。
示例:
1.拿日誌記錄器來舉例
//建立的目標類
interface Logger{
void writeLog();
}
class DatabaseLogger implements Logger{
@Override
public void writeLog() {
System.out.println("數據庫日誌記錄類");
}
}
class FileLogger implements Logger{
@Override
public void writeLog() {
System.out.println("文件日誌記錄類");
}
}
//定義工廠類
interface LoggerFactory{
Logger createLogger();
}
class DatabaseLoggerFactory implements LoggerFactory{
@Override
public Logger createLogger() {
//建立數據庫日誌記錄器類
Logger logger = new DatabaseLogger();
return logger;
}
}
class FileLoggerFactory implements LoggerFactory{
@Override
public Logger createLogger() {
//建立數據庫日誌記錄器類
Logger logger = new FileLogger();
return logger;
}
}
//測試類
class Test{
public static void main(String []args){
LoggerFactory factory;
Logger logger;
factory = new FileLoggerFactory(); //可引入配置文件實現(原理:從配置文件中獲取類的路徑,再經過反射類建立工廠類,爲了實現開閉原則,能夠在個人適配器模式中看到思路)
logger = factory.createLogger();
logger.writeLog();
}
}
總結:
1.每次增長一個產品時,都須要增長一個具體類和對象實現工廠,使得系統中類的個數成倍增長,在必定程度上增長了系統的複雜度,同時也增長了系統具體類的依賴。這並非什麼好事。