單例模式工廠模式
單例模式
單例模式的目的就是為了控制特定的類只產生一個對象。
產生單例的步驟:
1、構造方法私有化(在構造方法前面加prevate static finall)為的是不讓其他類創建該類的實例化對象。
2、在類中自己創建自己的實例化對象。
3、寫一個方法,返回該實例化對象。
4、在該類中還可以寫其他的方法。
具體的代碼如下:
public class Danli
{
// 構造方法私有化,讓其他類調用不到
private Danli()
{
}
// 在類中自己創建自己的實例化對象,
private static final Danli danli = new
// 寫一個方法,可以返回該唯一單例的實例化對象,
//註意一定要加static不然其他的類中調用不到該方法,也就創建不到實例化對象
Public static Danli getDanli()
{
return danli;
}
// 在單例的類中寫其他的方法,一般是其他類共享的數據
public static void doSomething()
{
System.out.println("這是單例");
}
}
Java中使用單例的優勢:
1、減少Java中因為創建實例所帶來的開銷。
2、便於系統跟蹤單個Java實例的生命周期和實例狀態。
Java單例運用的場景
1、要求生成唯一序列號的環境
2、在整個項目中需要一個共享訪問點,或者共享訪問數據
3、需要定義大量的靜態常量和靜態方法(如工具類)的環境
4、創建一個對象需要消耗的資源過多,如要訪問IO(輸入流)和數據庫資源
工廠模式
工廠模式主要是為創建對象提供過渡接口,以便將創建對象的過程屏蔽起來達到提高靈活性的目的。
簡單工廠模式
簡單工廠模式又稱為靜態工廠模式,它屬於創建型模式。主要是根據傳入的變量的不同返回不同類型的實例化對象。被創建的類通常都有共同的父類或者是實現了共同的接口。
簡單工廠模式的組成:
1、工廠類(factory):由具體的Java類實現,該類根據參數的不同創建不同的實例化對象。
2、抽象產品(product):一般是有factory創建的具體的實體類的父類或者是他們共同實現的接口。
3、具體的產品(factory product):factory具體要創建的實體類。
例子:利用簡單工廠模式描述果園系統;抽象出的類包括:【1、抽象產品fruit】【2、具體產品apple樹,grape樹strawBerry樹】【工廠類 園丁gardener種樹】
具體的代碼如下:
【1、抽象產品fruit】
/**
* 接口裏面寫水果類必備的方法:種植plant();成長grow();和豐收harvest();
*/
public interface Fruit
{
public void plant();
public void grow();
public void harvest();
}
【2、具體產品apple樹,grape樹strawBerry樹】
public class Apple implements Fruit
{
@Override
public void plant()
{
// TODO Auto-generated method stub
System.out.println("種蘋果樹");
}
@Override
public void grow()
{
// TODO Auto-generated method stub
System.out.println("蘋果樹在成長");
}
@Override
public void harvest()
{
// TODO Auto-generated method stub
System.out.println("收蘋果");
}
}
【工廠類 園丁gardener種樹】
/**
* gardenner負責創建具體的實例化對象
*/
public class Gardener
{
// 寫一個方法,返回值是具體要創建的對象的父類,或者是他們共同實現的接口
public Fruit factory(String fruitName)
{
if ("apple".equals(fruitName))
{
return new Apple();
}
else if ("grape".equals(fruitName))
{
return new Grape();
}
else if ("strawberry".equals(fruitName))
{
return new StrawBerry();
}
else
{
System.out.println("輸入的名字不正確");
return null;
}
}
}
【測試】
public class Test
{
public static void main(String[] args)
{
// 實例化工廠對象
Gardener gardener = new Gardener();
// 創建蘋果樹
Fruit apple = gardener.factory("apple");
apple.plant();
apple.grow();
apple.harvest();
// 創建葡萄樹,並調用裏面的在成長方法
Fruit f1 = gardener.factory("grape");
f1.grow();
// 創建葡萄樹,並調用裏面的在成長方法
Fruit f2 = gardener.factory("grape");
f2.grow();
// 創建樹用的不是單例,所以f1 != f2
System.out.println(f1 != f2);
}
}
簡單工廠模式使用的環境:
1、工廠類負責創建的對象那個比較少
2、客戶只知道傳入工廠類的方法,對於如何創建對象則不關心
工廠方法模式
工廠方法模式在簡單工廠模式的基礎上添加了抽象工廠,這樣就可以在對不同的產品使用不同的工廠。
工廠方法模式的組成
1、抽象工廠角色:工廠的實體類抽象出來的接口,或者他們共同繼承的父類
2、具體工廠角色:裏面寫具體的業務邏輯相關的代碼
3、抽象產品角色:具體的產品共同繼承的父類或者實現的接口,負責定義產品的共性,實現對事物的最抽象的定義。
4、具體的產品角色:具體的工廠所創建的對象。在Java中由具體的類實現
工廠方法模式的結構圖:
工廠方法模式使用的場景:
1、一個類不知道他需要的對象的類
2、一個類通過其子類制定創建哪個對象
對於抽象工廠類只需要提供一個創建產品的接口,而又其子類確定具體要創建的對象。在程序運行時,子類對象將覆蓋父類對象,從而使系統共容易擴展。
將創建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時可以不用關心是哪一個工廠子類在創建產品子類,需要時在動態指定,可以將具體的工廠類的類名儲存在配置文件中或者數據庫中。
單例模式工廠模式