設計模式-結構型之享元(flyweight)模式

定義

  • 通過儘量共享實例來避免 new 出實例。

使用場景

  • 大範圍使用,可以使用該模式達到共享。
  • 舉例:數據庫連接池、線程池等。

UML圖

在這裏插入圖片描述

代碼實現

// 共享對象
public class Flyweight {

    private String name;

    public Flyweight(String name) {
        this.name = name;
    }

    public void method(){
        System.out.println("共享對象的方法");
    }
}
//池子工廠
public class FlyweightFactory {

    private Map<String,Flyweight> flyweightMap = new HashMap<>();

    //單例
    private static FlyweightFactory factory = new FlyweightFactory();

    //私有構造
    private FlyweightFactory(){}

    //公有獲取單例
    public static FlyweightFactory getFacttory(){
        return factory;
    }

    //獲取共享對象: 使用synchronized 保證線程安全
    public synchronized Flyweight getFlyweight(String key){
        Flyweight flyweight = flyweightMap.get(key);
        //如果沒有則創建並放入池子
        if(flyweight == null){
            flyweight = new Flyweight(key);
            flyweightMap.put(key,flyweight);
        }
        return flyweight;
    }

    //池子元素總數
    public int size(){
        return flyweightMap.size();
    }
}

public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = FlyweightFactory.getFacttory();
        Flyweight flyweight = factory.getFlyweight("共享");
        flyweight.method();
        factory.getFlyweight("共享2");
        //池子中已有,無需再創建
        factory.getFlyweight("共享");
		//池中只有兩個實例
        int size = factory.size();
    }
}

總結

  • 通過儘量共享實例來避免 new 出實例。
  • 減少new 實例,達到減少對資源的佔用,通過共享直接從池中獲取,不需創建,大大提升程序效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章