《大話設計模式》—— 讀後感(26)專案多也別傻做——享元模式
阿新 • • 發佈:2019-02-20
享元模式
運用共享技術有效地支援大量細粒度的物件。(摘抄)
這個模式每天在編碼的時候都在用,java中的String就用到了享元模式。
String a = "123";
String b = "123";
這個只要認真學過基礎的童鞋應該都知道,這兩個String物件是同一個物件,都是指向“123”。在這個裡面就是用的享元模式。
對於享元模式,我的理解就是新建相同的物件的時候,而且這兩個物件去做相同的,那麼應該引用已經建立好的物件,而不是去新建一個相同的去浪費記憶體。這個時候肯定有人會問要是每個物件裡面有自己的識別符號號,兩個物件並不完全相同怎麼辦,這時就是後面需要提到的——內部狀態和外部狀態。
簡單的共享物件
import java.util.HashMap; import org.apache.commons.collections.map.HashedMap; public abstract class Flyweight { public abstract void Operation(int i); } public class ConcreteFlyweight extends Flyweight { @Override public void Operation(int i) { // TODO Auto-generated method stub System.out.println(""+i); } } //享元工廠用來判斷是否需要生成新的物件 public class FlyweightFactory { private HashMap<String, Flyweight> flyweights = new HashMap<String, Flyweight>(); public Flyweight getfFlyweight (String x) { if (!flyweights.containsValue(x)) { flyweights.put(x, new ConcreteFlyweight()); return flyweights.get(x); } else { return flyweights.get(x); } } } class Client { public static void main() { FlyweightFactory factory = new FlyweightFactory(); Flyweight flyweight1 = factory.getfFlyweight("x"); Flyweight flyweight2 = factory.getfFlyweight("x"); } } //有些Flyweight不能被共享那麼就寫一個繼承的類直接呼叫就可以了
最簡單的共享就實現了,此時就是開始說一下內部狀態和外部狀態
在享元物件內部並且不會隨環境改變而改變的共享部分稱為內部狀態
隨環境改變而改變,不可以共享的狀態稱為外部狀態
當你在寫程式的過程中如果能發現這些例項除了幾個引數外基本相同,那麼把這些引數放到享元的外部,在方法呼叫時將它們傳遞進來,就可以通過享元共享大幅度的減少單個例項的數目。(摘抄)
public class User { private String name; public String getName() { return name; } public User(String name) { super(); this.name = name; } } public abstract class Flyweight { public abstract void Operation(int i); public abstract void whoUse(User user); }
享元模式應用
如果一個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用;還有就是物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式。