### 享元模式
運用共享技術有效地支持大量細粒度的對象。(摘抄)
這個模式每天在編碼的時候都在用,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);
}
~~~
### 享元模式應用
如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。
- 前言
- (1)代碼無錯就是優?——簡單工廠模式
- (2)商場促銷——策略模式
- (3)&amp;(4)&amp;(5) 設計模式原則
- (6)穿什么有這么重要?——裝飾模式
- (7)為別人做嫁衣——代理模式
- (8)雷鋒依然在人間——工廠方法模式
- (9)簡歷復印——原型模式
- (10)考題抄錯會做也白搭——模板方法模式
- (11)迪米特法則
- (12)牛市股票還會虧錢?—— 外觀模式
- (13)好菜每回味不同——建造者模式
- (14)老板回來,我不知道——觀察者模式
- java實現事件委托
- (15)就不能不還DB嗎?—— 抽象工廠模式
- (16)無盡加班何時休息——狀態模式
- (17)在NBA我需要翻譯——適配器模式
- (18)如果再回到從前——備忘錄模式
- (19)分公司=部門——組合設計模式
- (20)想走?可以!先買票——迭代器模式
- (21)有些類也需計劃生育——單例模式
- (22)手機軟件何時統一——橋接模式
- (23)烤羊肉串引來的思考——命令模式
- (24)加薪非要老總批?——職責鏈模式
- (25)世界需要和平——中介者模式
- (26)項目多也別傻做——享元模式
- (28)男人和女人——訪問者模式