設計模式 工廠,單例,策略

2021-09-30 14:37:56 字數 3936 閱讀 9793

介紹:

工廠模式(****** factory)屬於建立型模式,它提供了一種建立物件的最佳方式。

在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面來指向新建立的物件。

何時使用:我們明確地計畫不同條件下建立不同例項時。

如何解決:讓其子類實現工廠介面,返回的也是乙個抽象的產品。

**使用場景**1資料庫訪問,當使用者不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。2設計乙個連線伺服器的框架,需要三個協議,」pop3」、」imap」、」http」,可以把這三個作為產品類,共同實現乙個介面。

例項:

①建立乙個介面

②建立幾個介面的實現類

③建立乙個工廠類,生成基於給定資訊的實體類的物件。

④使用該工廠,通過傳遞型別資訊來獲取實體類的物件。

//1

public

inte***ce

inte

//2public

class

imp1

implements

inte

public

class

imp2

implements

inte

//3public

class

xxfactory

if(o...)

else

if(o...)

... return

null;}}

//4xxfactory x=new xxfactory();

inte i=x.getinte(object o);

uml例項

工廠方法模式(factory method) ,簡單工廠就是它的乙個特例而已。該模式就是將簡單工廠方法中的工廠類定義為抽象的。然後通過實現類去構造對應的物件。

①建立乙個介面

②建立幾個介面的實現類

③建立乙個工廠介面,定義乙個返回產品類的方法。

④實現該工廠類,返回不同的產品物件

⑤使用。

工廠方法模式彷彿已經很完美的對物件的建立進行了包裝,使得客戶程式中僅僅處理抽象產品角色提供的介面,但使得物件的數量成倍增長。當產品種類非常多時,會出現大量的與之對應的工廠物件,這不是我們所希望的。

//3

public inte***ce xxfactory

//4public

class

inte1factory

implements

xxfactory

}//5

inte1factory f=new inte1factory();

inte1 i=f.creat();

何時使用:系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品。

如何解決:在乙個產品族裡面,定義多個產品。

使用場景: 1、qq 換**,一整套一起換。 2、生成不同作業系統的程式。

①建立乙個介面a

②建立幾個介面a的實現類a1,a2

③建立乙個介面b

④建立幾個介面b的實現類b1,b2

⑤建立乙個抽象工廠f,定義獲取a,b物件的兩個方法geta(),getb()

public

abstract

class f

⑥建立工廠類af實現抽象工廠f,重寫方法,geta(),基於給定的資訊生成實體類的物件

⑦建立工廠類bf實現抽象工廠f,重寫方法,getb(),基於給定的資訊生成實體類的物件

public

class

af extendsf

if(atype.equalsignorecase("a1")) else

if(atype.equalsignorecase("a2"))

return

null;

}@override

color getb(string b)

}

⑧建立乙個生成器類factoryproduce,通過傳遞a或b的資訊來獲取工廠。

public

class factoryproducer else

if(choice.equalsignorecase("b"))

return

null;}}

⑨使用,先獲取工廠,再獲取物件。

abstractfactory af = factoryproducer.getfactory("a");

a1 a1 = af.geta("a1");

例項:

單例類只能有乙個例項。涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

使用場景:1、要求生產唯一序列號。 2、web 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先快取起來。 3、建立的乙個物件需要消耗的資源過多,比如 i/o 與資料庫的連線等。

實現:

//懶漢式(第一次訪問建立,多執行緒不安全,需要在方法上加上synchronized)

public

class singleton

//獲取唯一物件的方法

public

static singleton getinstance()

return instance;

} } //餓漢式(常用 類載入時就初始化,浪費記憶體)

public

class singleton

public

static singleton getinstance()

}//列舉(自動支援序列化機制,不能通過反射來呼叫私有構造方法。)

public

enum singleton

乙個類的行為或其演算法可以在執行時更改。策略模式屬於行為型模式。在有多種演算法相似的情況下,使用 if…else 所帶來的複雜和難以維護,這些演算法封裝成乙個乙個的類,任意地替換。

使用場景: 1、如果在乙個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓乙個物件在許多行為中選擇一種行為。 2、乙個系統需要動態地在幾種演算法中選擇一種。 3、如果乙個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。

①建立乙個介面strategy,定義乙個方法

②建立實現介面的實體類。(多個策略多個實現類)

③建立上下文類,context。(關鍵部分)

④使用 context 來檢視當它改變策略 strategy 時的行為變化。

//3

public

class context

public object executestrategy(object o...)

}//4使用

context context = new context(new strategya());

context.executestrategy(object o...);

例項:

js 設計模式學習(單例 工廠 訂閱 策略)

把好的例子總結 抄 了下 下面這個例子就是只生成乙個mask,用到了閉包 參考var singleton function fn var createmask singleton function basic singleton var singleton method2 function 還有上面...

設計模式 策略模式單例模式

策略模式 物件使用的演算法是變化的,物件是穩定的 將穩定和穩定的部分隔離開 面向介面程式設計 之後使用工廠模式單例模式 系統中特殊的類 只能出現乙個例項 設計一種方法 只能發回乙個物件 繞過常規的構造器 只提供乙個物件 方法 1.建構函式 和 拷貝函式都寫成private的 遮蔽系統的建構函式 2....

設計模式 單例模式 工廠模式

1.單例設計模式 乙個類中只能有乙個物件 分為 懶漢單例模式和餓漢單例模式 懶漢單例模式 1.私有化構造器 2.宣告本類引用的型別,不要去指向物件 3.提供乙個公共靜態的方法,為外部提供物件,先判斷引用型別是否為物件,如果不是,則引用指 向乙個new 類名 並返回 如果有就返回這個引用 public...