1. 程式人生 > 實用技巧 >設計模式-享元模式

設計模式-享元模式

一、享元模式理解

享元言外之意就是共享,共享就是一樣不變的部分能夠得到重用,公用,享元模式則是對物件的共享,有點類似於單例模式的懶漢模式,降低系統cpu,記憶體的消耗,不同於單例模式的是,享元模式分為內部狀態和外部狀態,內部狀態就好比單例模式,不會改變,而外部方式是隨著需求而改變的,比如汽車某一個型號的發動機不會變動,變動的是他要裝載在哪一類車上,或者說棋子,不變的是黑色和白色,變的是他的位置座標。

二、程式碼實現

public class Engine {
    private String name;
    private String molde;

    public Engine(String name, String molde) {
        System.out.println(
"開始造發動機:"+name); this.name = name; this.molde = molde; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMolde() { return molde; } public void setMolde(String molde) {
this.molde = molde; } @Override public String toString() { return "Engine{" + "name='" + name + '\'' + ", molde='" + molde + '\'' + '}'; } } //工廠類 public class EngineFactory { Map<String,Engine> engineMap=new HashMap<String,Engine>();
public Engine getEngine(String name,String molde){ if(null!=engineMap.get(name)){ return engineMap.get(name); } Engine engine=new Engine(name,molde); engineMap.put(name,engine); return engine; } } //外部變化部分 public class Car { private String type; private Engine engine; public Car(String type, Engine engine) { this.type = type; this.engine = engine; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } @Override public String toString() { return "Car{" + "type='" + type + '\'' + ", engine=" + engine + '}'; } } //測試類 public class Test { public static void main(String[] args) { EngineFactory engineFactory=new EngineFactory(); Car car1=new Car("高階car",engineFactory.getEngine("高階發動機","001")); Car car2=new Car("高階car",engineFactory.getEngine("高階發動機","001")); Car car3=new Car("低階car",engineFactory.getEngine("一般發動機","001")); Car car4=new Car("低階car",engineFactory.getEngine("一般發動機","001")); System.out.println(car1+"/r"+car2+"/r"+car3+"/r"+car4); } }

三、使用場景

1.系統中需要生成大量的相似物件

2、需要用到池的場景,如資料庫連線池、String常量池、緩衝池

三、總結

享元模式好比是工程模式+單例模式實現,客戶端傳遞不同引數到工廠,工廠生產不同的產品,產品按照型別生產,不同型別共用一個物件,說到共享就會聯想到執行緒安全,在物件的生成一定要加同步關鍵字+雙重判斷