購物網(wǎng)站建設(shè)包括哪些做電商需要學(xué)哪些基礎(chǔ)
Go和Java實(shí)現(xiàn)享元模式
下面通過一個(gè)實(shí)例來說明享元模式的使用。
1、享元模式
享元模式主要用于減少創(chuàng)建對(duì)象的數(shù)量,以減少內(nèi)存占用和提高性能。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它提
供了減少對(duì)象數(shù)量從而改善應(yīng)用所需的對(duì)象結(jié)構(gòu)的方式。
享元模式嘗試重用現(xiàn)有的同類對(duì)象,如果未找到匹配的對(duì)象,則創(chuàng)建新對(duì)象。
-
意圖:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。
-
主要解決:在有大量對(duì)象時(shí),有可能會(huì)造成內(nèi)存溢出,我們把其中共同的部分抽象出來,如果有相同的業(yè)務(wù)請(qǐng)
求,直接返回在內(nèi)存中已有的對(duì)象,避免重新創(chuàng)建。
-
何時(shí)使用:1、系統(tǒng)中有大量對(duì)象。 2、這些對(duì)象消耗大量?jī)?nèi)存。 3、這些對(duì)象的狀態(tài)大部分可以外部化。 4、
這些對(duì)象可以按照內(nèi)蘊(yùn)狀態(tài)分為很多組,當(dāng)把外蘊(yùn)對(duì)象從對(duì)象中剔除出來時(shí),每一組對(duì)象都可以用一個(gè)對(duì)象來
代替。 5、系統(tǒng)不依賴于這些對(duì)象身份,這些對(duì)象是不可分辨的。
-
如何解決:用唯一標(biāo)識(shí)碼判斷,如果在內(nèi)存中有,則返回這個(gè)唯一標(biāo)識(shí)碼所標(biāo)識(shí)的對(duì)象。
-
關(guān)鍵代碼:用 HashMap 存儲(chǔ)這些對(duì)象。
-
應(yīng)用實(shí)例:1、JAVA 中的 String,如果有則返回,如果沒有則創(chuàng)建一個(gè)字符串保存在字符串緩存池里面。 2、
數(shù)據(jù)庫的連接池。
-
優(yōu)點(diǎn):大大減少對(duì)象的創(chuàng)建,降低系統(tǒng)的內(nèi)存,使效率提高。
-
缺點(diǎn):提高了系統(tǒng)的復(fù)雜度,需要分離出外部狀態(tài)和內(nèi)部狀態(tài),而且外部狀態(tài)具有固有化的性質(zhì),不應(yīng)該隨著
內(nèi)部狀態(tài)的變化而變化,否則會(huì)造成系統(tǒng)的混亂。
-
使用場(chǎng)景:1、系統(tǒng)有大量相似對(duì)象。 2、需要緩沖池的場(chǎng)景。
-
注意事項(xiàng):1、注意劃分外部狀態(tài)和內(nèi)部狀態(tài),否則可能會(huì)引起線程安全問題。 2、這些類必須有一個(gè)工廠對(duì)
象加以控制。
-
適用性:
一個(gè)應(yīng)用程序使用了大量的對(duì)象。
完全由于使用大量的對(duì)象,造成很大的存儲(chǔ)開銷。
對(duì)象使大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)。
如果刪除對(duì)象的外部狀態(tài),那么可以使相對(duì)較少的共享對(duì)象取代很多組對(duì)象。
應(yīng)用程序不依賴于對(duì)象標(biāo)識(shí),由于 Flyweight 對(duì)象可以被共享,對(duì)于概念上明顯有別的對(duì)象,標(biāo)識(shí)測(cè)試將返回
真值。
2、Go實(shí)現(xiàn)享元模式
package flyweight// ========== Flyweight ==========
type Flyweight interface {Action(arg int)
}
package flyweightimport "fmt"// ========== FlyweightImpl ==========
type FlyweightImpl struct {
}func (flyweightImpl *FlyweightImpl) Action(arg int) {fmt.Println("參數(shù)值: ", arg)
}
package flyweight// ========== FlyweightFactory ==========
type FlyweightFactory struct {flyweights map[string]Flyweight
}func NewFlyweightFactory() FlyweightFactory {return FlyweightFactory{flyweights: map[string]Flyweight{},}
}func (flyweightFactory *FlyweightFactory) GetFlyweight(key string) Flyweight {if flyweightFactory.flyweights[key] == nil {flyweightFactory.flyweights[key] = new(FlyweightImpl)}return flyweightFactory.flyweights[key]
}func (flyweightFactory *FlyweightFactory) GetSize() int {return len(flyweightFactory.flyweights)
}
package mainimport ("fmt". "proj/flyweight"
)func main() {flyWeight := NewFlyweightFactory()fly1 := flyWeight.GetFlyweight("a")fly1.Action(1)fly2 := flyWeight.GetFlyweight("a")fmt.Println(fly1 == fly2)fly3 := flyWeight.GetFlyweight("b")fly3.Action(2)fly4 := flyWeight.GetFlyweight("c")fly4.Action(3)fly5 := flyWeight.GetFlyweight("d")fly5.Action(4)fmt.Println(flyWeight.GetSize())
}
# 輸出
參數(shù)值: 1
true
參數(shù)值: 2
參數(shù)值: 3
參數(shù)值: 4
4
3、Java實(shí)現(xiàn)享元模式
package flyweight;// ========== Flyweight ==========
public interface Flyweight {void action(int arg);
}
package flyweight;// ========== FlyweightImpl ==========
public class FlyweightImpl implements Flyweight {@Overridepublic void action(int arg) {System.out.println("參數(shù)值: " + arg);}
}
package flyweight;import java.util.HashMap;
import java.util.Map;// ========== FlyweightFactory ==========
public class FlyweightFactory {private final static Map<String,Flyweight> FLY_WEIGHTS = new HashMap<>();public FlyweightFactory(String arg) {FLY_WEIGHTS.put(arg, new FlyweightImpl());}public static Flyweight getFlyweight(String key) {if (FLY_WEIGHTS.get(key) == null) {FLY_WEIGHTS.put(key,new FlyweightImpl());}return FLY_WEIGHTS.get(key);}public static int getSize() {return FLY_WEIGHTS.size();}
}
package flyweight;public class Test {public static void main(String[] args) {Flyweight fly1 = FlyweightFactory.getFlyweight("a");fly1.action(1);Flyweight fly2 = FlyweightFactory.getFlyweight("a");System.out.println(fly1 == fly2);fly2.action(2);Flyweight fly3 = FlyweightFactory.getFlyweight("b");fly3.action(3);Flyweight fly4 = FlyweightFactory.getFlyweight("c");fly4.action(4);Flyweight fly5 = FlyweightFactory.getFlyweight("d");fly5.action(5);System.out.println(FlyweightFactory.getSize());}
}
# 輸出
參數(shù)值: 1
true
參數(shù)值: 2
參數(shù)值: 3
參數(shù)值: 4
參數(shù)值: 5
4