elasticsearch入門系列">elasticsearch入門系列
624
2022-05-29
前言
設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設(shè)計模式于己于他人于系統(tǒng)都是多贏的,設(shè)計模式使代碼編制真正工程化,設(shè)計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設(shè)計模式可以完美的解決很多問題,每種模式在現(xiàn)在中都有相應(yīng)的原理來與之對應(yīng),每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的核心解決方案,這也是它能被廣泛應(yīng)用的原因。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、享元模式(Flyweight Pattern)
享元模式屬于結(jié)構(gòu)型模式,它以共享的方式高效的支持大量的細(xì)粒度對象。通過復(fù)用內(nèi)存中已存在的對象,降低系統(tǒng)創(chuàng)建對象實例的性能消耗。
享元模式嘗試重用現(xiàn)有的同類對象,如果未找到匹配的對象,則創(chuàng)建新對象,如果找到對象,則直接返回。
二、使用步驟
角色
1、抽象享元(Flyweight)
它是所有具體享元類的抽象基類,為其子類規(guī)定出需要實現(xiàn)的公共接口;
2、具體享元(Concrete Flyweight)
具體享元類實現(xiàn)了抽象享元類所規(guī)定的接口;
3、享元工廠(FlyweightFactoiy)
享元工廠類負(fù)責(zé)創(chuàng)建和管理享元對象。
示例
命名空間FlyweightPattern中包含IConnection接口充當(dāng)抽象享元,Connection類充當(dāng)具體享元,ConnectionFactory工廠類充當(dāng)享元工廠。本案例通過使用享元模式來共享數(shù)據(jù)庫連接。
public interface IConnection { void Print(); }
IConnection接口,包含一個打印的方法。
public class Connection : IConnection { private string _connectionString = null; public Connection(string connectionString) { _connectionString = connectionString; Thread.Sleep(1000); Console.WriteLine("It took 1 second(s) to create a connection!"); } public void Print() { Console.WriteLine($"Database connection is {_connectionString}"); Console.WriteLine("-------------------------------------------------------"); } }
Connection類,定義數(shù)據(jù)庫連接(演示)。
public class ConnectionFactory { private Dictionary
ConnectionFactory類,數(shù)據(jù)庫連接工廠,內(nèi)部維持對所有連接的引用,CreateConnection方法在發(fā)現(xiàn)連接存在時直接返回,如果不存在,則創(chuàng)建一個新的連接并維持進(jìn)列表。
注:實際開發(fā)過程中應(yīng)該用HashCode來檢索數(shù)據(jù)庫連接是否存在。
public class Program { private static ConnectionFactory _factory = null; private static List
以上是調(diào)用方的代碼,以下是這個案例的輸出結(jié)果:
Creating a new connection! It took 1 second(s) to create a connection! Database connection is Server=Aron1;Database=pubs; Uid=uid;Pwd=password; ------------------------------------------------------- Creating a new connection! It took 1 second(s) to create a connection! Database connection is Provider=sqloledb;Data Source=Aron1; User Id=uid;Password=password; ------------------------------------------------------- Creating a new connection! It took 1 second(s) to create a connection! Database connection is Data Source=192.168.0.1,1433; UserID=uid;Password=password; ------------------------------------------------------- Return an exist connection! Database connection is Provider=sqloledb;Data Source=Aron1; User Id=uid;Password=password; ------------------------------------------------------- Index Out Of Range Exception!
總結(jié)
優(yōu)點
1、降低了系統(tǒng)中對象的數(shù)量,從而降低了系統(tǒng)中細(xì)粒度對象給內(nèi)存帶來的壓力。
缺點
1、為了使對象可以共享,需要將一些狀態(tài)外部化,這使得程序的邏輯更復(fù)雜,使系統(tǒng)復(fù)雜化;
2、享元模式將享元對象的狀態(tài)外部化,而讀取外部狀態(tài)使得運行時間稍微變長。
使用場景
1、一個系統(tǒng)中有大量的對象;
2、這些對象耗費大量的內(nèi)存;
3、這些對象中的狀態(tài)大部分都可以被外部化;
4、這些對象可以按照內(nèi)部狀態(tài)分成很多的組,當(dāng)把外部對象從對象中剔除時,每一個組都可以僅用一個對象代替;
5、軟件系統(tǒng)不依賴這些對象的身份。
面向?qū)ο缶幊?/p>
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。