UML關(guān)系簡(jiǎn)單介紹
UML簡(jiǎn)單使用的介紹
創(chuàng)建型設(shè)計(jì)模式
Android設(shè)計(jì)模式-單例模式
Android設(shè)計(jì)模式-工廠模式
Android設(shè)計(jì)模式-抽象工廠模式
Android設(shè)計(jì)模式-建造者模式
Android設(shè)計(jì)模式-原型模式
結(jié)構(gòu)型設(shè)計(jì)模式
Android設(shè)計(jì)模式-代理模式
Android設(shè)計(jì)模式-裝飾模式
Android設(shè)計(jì)模式-適配器模式
Android設(shè)計(jì)模式-組合模式
Android設(shè)計(jì)模式-門面模式
Android設(shè)計(jì)模式-橋接模式
Android設(shè)計(jì)模式-享元模式
行為型設(shè)計(jì)模式
Android設(shè)計(jì)模式-策略模式
Android設(shè)計(jì)模式-命令模式
Android設(shè)計(jì)模式-責(zé)任鏈模式
Android設(shè)計(jì)模式-模版方法模式
Android設(shè)計(jì)模式-迭代器模式
Android設(shè)計(jì)模式-觀察者模式
Android設(shè)計(jì)模式-備忘錄模式
Android設(shè)計(jì)模式-中介者模式
Android設(shè)計(jì)模式-訪問(wèn)者模式
Android設(shè)計(jì)模式-狀態(tài)模式
Android設(shè)計(jì)模式-解釋器模式
1.定義
享元模式是池技術(shù)的重要實(shí)現(xiàn)方式蔼两。使用共享對(duì)象可以有效的支持大量的細(xì)粒度的對(duì)象宪卿。
享元模式的定義提到了細(xì)粒度和共享對(duì)象,要求細(xì)粒度,那就很可能會(huì)產(chǎn)生大量相似對(duì)象燥滑,由此痘煤,在這里需要用到共享技術(shù)士骤,來(lái)減少大量對(duì)象的產(chǎn)生忆蚀,防止內(nèi)存的大量消耗。這里引入來(lái)內(nèi)部狀態(tài)和外部狀態(tài)兩個(gè)概念集晚。
- 內(nèi)部狀態(tài)
內(nèi)部狀態(tài)是對(duì)象可共享出來(lái)的信息窗悯,儲(chǔ)存在對(duì)象內(nèi)部并且不會(huì)隨著環(huán)境的改變而發(fā)生改變。他可以作為一個(gè)對(duì)象的動(dòng)態(tài)附加信息偷拔,不必直接存儲(chǔ)在具體的某個(gè)對(duì)象中蒋院,屬于可以共享的部分。 - 外部狀態(tài)
外部狀態(tài)是對(duì)象不可共享出來(lái)的信息莲绰,是隨著環(huán)境改變而改變的欺旧。
在享元模式中可以共享的相同內(nèi)容稱為內(nèi)部狀態(tài)(IntrinsicState),而那些需要外部環(huán)境來(lái)設(shè)置的不能共享的內(nèi)容稱為外部狀態(tài)(Extrinsic State)蛤签,由于區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài)辞友,因此可以通過(guò)設(shè)置不同的外部狀態(tài)使得相同的對(duì)象可以具有一些不同的特征,而相同的內(nèi)部狀態(tài)是可以共享的震肮。
在享元模式中共享的是享元對(duì)象的內(nèi)部狀態(tài)称龙,外部狀態(tài)需要通過(guò)環(huán)境來(lái)設(shè)置。在實(shí)際使用中戳晌,能夠共享的內(nèi)部狀態(tài)是有限的鲫尊,因此享元對(duì)象一般都設(shè)計(jì)為較小的對(duì)象,它所包含的內(nèi)部狀態(tài)較少沦偎,這種對(duì)象也稱為細(xì)粒度對(duì)象疫向。享元模式的目的就是使用共享技術(shù)來(lái)實(shí)現(xiàn)大量細(xì)粒度對(duì)象的復(fù)用咳蔚。
2.享元模式UML圖
角色介紹
- Flyweight 抽象享元角色,簡(jiǎn)單說(shuō)就是一個(gè)產(chǎn)品的抽象類或者接口搔驼,同時(shí)定義出外部狀態(tài)和內(nèi)部狀態(tài)的接口或者實(shí)現(xiàn)
- ConcreteFlyweight 具體享元角色谈火,具體的一個(gè)產(chǎn)品類,實(shí)現(xiàn)了抽象角色中定義的業(yè)務(wù)舌涨。需要注意的是內(nèi)部狀態(tài)的處理應(yīng)該與環(huán)境無(wú)關(guān)糯耍,不應(yīng)該出現(xiàn)一個(gè)操作改變了內(nèi)部狀態(tài),同時(shí)修改了外部狀態(tài)囊嘉,這是絕對(duì)不允許的
- unsharedConcreteFlyweight 不可共享的享元角色谍肤,不存在外部狀態(tài)或者安全要求(如線程安全)不能使用共享技術(shù)的對(duì)象。該對(duì)象一般不會(huì)出現(xiàn)在享元工廠哗伯。
- FlyweightFactory 享元工廠,就是構(gòu)造一個(gè)對(duì)象池篷角,同時(shí)提供從池中獲得對(duì)象的方法焊刹。
3.簡(jiǎn)單實(shí)現(xiàn)
3.1抽象享元角色
public interface Flyweight {
void operation(String extrinsic);
}
3.2具體享元角色
public class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String extrinsic) {
System.out.println("內(nèi)部狀態(tài)為"+intrinsicState);
System.out.println("外部狀態(tài)為"+extrinsic);
System.out.println("本類為"+this);
}
}
3.3享元工廠
public class FlyweightFactory {
private static Map<String,Flyweight> weights = new HashMap<String,Flyweight>();
public static Flyweight factory(String state){
Flyweight flyweight = weights.get(state);
if(flyweight == null){
//如果對(duì)象不存在則創(chuàng)建一個(gè)新的Flyweight對(duì)象
flyweight = new ConcreteFlyweight(state);
//把這個(gè)新的Flyweight對(duì)象添加到池中
weights.put(state, flyweight);
}
return flyweight;
}
}
3.4客戶端調(diào)用
public class MyClass {
public static void main(String args[]) {
Flyweight flyweight1= FlyweightFactory.factory("1");
flyweight1.operation("a");
Flyweight flyweight2=FlyweightFactory.factory("2");
flyweight2.operation("b");
Flyweight flyweight3=FlyweightFactory.factory("1");
flyweight3.operation("b");
}
}
打印結(jié)果
內(nèi)部狀態(tài)為1
外部狀態(tài)為a
本類為com.example.lib1.shared.ConcreteFlyweight@1540e19d
內(nèi)部狀態(tài)為2
外部狀態(tài)為b
本類為com.example.lib1.shared.ConcreteFlyweight@677327b6
內(nèi)部狀態(tài)為1
外部狀態(tài)為b
本類為com.example.lib1.shared.ConcreteFlyweight@1540e19d
從例子中可以看出,最后客戶端處是要新建三個(gè)對(duì)象恳蹲,但是從打印結(jié)果可以看到虐块,第一個(gè)和第三個(gè)對(duì)象實(shí)際為同一個(gè),也就是只創(chuàng)建了兩個(gè)嘉蕾。通過(guò)內(nèi)部狀態(tài)作為key值進(jìn)行區(qū)別贺奠,外部狀態(tài)根據(jù)環(huán)境要求做相應(yīng)的修改。
4.總結(jié)
- 優(yōu)點(diǎn) 享元模式的優(yōu)點(diǎn)在于它大幅度地降低內(nèi)存中相似對(duì)象的數(shù)量
- 缺點(diǎn) 提高了復(fù)雜性错忱,為了使對(duì)象可以共享儡率,將一些狀態(tài)外部化
- 使用場(chǎng)景 系統(tǒng)中存在大量相似對(duì)象。需要緩沖池的場(chǎng)景以清。