模式的混合-我們真的需要一次一次的讀配置嗎-MultitonPrototypeFactoryMethod
我們真的需要一次一次的讀配置嗎
- 通過配置文件,我們其實極大地優化了代碼的結構,很多易變的元素都可以通過配置來修訂.
- 配置文件是一個文件,那麼使用的時候不可避免的涉及到IO操作.
- 在內存不值錢的今天,我們到底是讀內存快還是讀文件快?
- 電腦存儲交互的情況下,不是也有緩存的結構嗎?
想解決的問題
- 減少對配置文件的訪問
- 讀配置的過程一次完成
- 讀配置改為讀內存
Prototype Multiton FactoryMethod
- 配置中的每個element,其實就是一個節點(XmlNode).如果把每個節點抽象成一個對象,我們其實是如何使用這個對象的?我們當然是只需要使用它的副本就好,這裡使用Prototype來作為節點的拷貝母體.
- 我們讀配置文件的時候需要使用一個Name來定位element,那麼我們當然也可以使用一個傳入的Name參數來需求一個工廠(FactoryMethod)幫我們生成prototype的拷貝對象.
- 所有節點在結構上是一個平行的關係,我們可以認為都是具有Name和Value屬性的,並且具有有限的個數,那麼我們當然可以使用多例(Multiton)來負載他.
圖解這個結構

1.我們寫一個配置文件,包含了一個數據庫連接字符串和一個文件的路徑配置
<?xml version="1.0" encoding="utf-8" ?>
<Myconfig>
<targets>
<database>"Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-WebApplication_Collection-20150925030318.mdf;Initial Catalog=aspnet-WebApplication_Collection-20150925030318;Integrated Security=True"</database>
<fileurl>"http://www.cnblogs.com/news/"</fileurl>
</targets>
</Myconfig>
2.我們為 [database] 和[fileurl]節點創建原型(prototype)
interface IConfigPrototype
{
IConfigPrototype Clone();
string GetName();
string GetValue();
}
class ConfigDatabasePrototype: ConfigPrototype, IConfigPrototype
{
public string Name { private get; set; }
public string ConnectionString { private get; set; }
public ConfigDatabasePrototype()
{
XmlNode _xn = base.ReadConfigFile("database");
Name = _xn.Name;
ConnectionString = _xn.InnerText;
}
public IConfigPrototype Clone()
{
return (IConfigPrototype)this.MemberwiseClone();
}
public string GetName()
{
return Name;
}
public string GetValue()
{
return ConnectionString;
}
}
class ConfigFileurlPrototype: ConfigPrototype, IConfigPrototype
{
public string Name { private get; set; }
public string Address { private get; set; }
public ConfigFileurlPrototype()
{
XmlNode _xn = base.ReadConfigFile("fileurl");
Name = _xn.Name;
Address = _xn.InnerText;
}
public IConfigPrototype Clone()
{
return (IConfigPrototype)this.MemberwiseClone();
}
public string GetName()
{
return Name;
}
public string GetValue()
{
return Address;
}
}
3.在原型(Prototype)中,我們需要處理對xml文件的讀的過程,且這個過程是共同的,所以我們抽象出一個層次來實現這個操作.這樣通過繼承關係可以使ConfigDatabasePrototype(database的原型)和ConfigFileurlPrototype(fileurl的原型)具有了這個實現.
abstract class ConfigPrototype
{
public XmlNode ReadConfigFile(string Cname)
{
//return System.Configuration.ConfigurationManager.AppSettings[Cname];
XmlDocument _doc = new XmlDocument();
_doc.Load("../../MyConfig.xml");
string xPath = "/Myconfig/targets/"+ Cname;
XmlNode _xm = _doc.SelectNodes(xPath).Cast<XmlNode>().SingleOrDefault();
return _xm;
}
}
4.使用一個工廠方法(FactoryMethod)來依據Name參數返回對應的原型對象的拷貝
public IConfigPrototype ConfigFactoryMethod(string Name)
{
IConfigPrototype _prototype =null;
switch (Name)
{
case "database":
_prototype = _configDatabasePrototype.Clone();
break;
case "fileurl":
_prototype = _configFileurlPrototype.Clone();
break;
default:
break;
}
return _prototype;
}
5.使用一個多例(Multiton)來容納這兩個原型對象(Prototype)
class ConfigMultiton
{
protected static IConfigPrototype _configDatabasePrototype = new ConfigDatabasePrototype();
protected static IConfigPrototype _configFileurlPrototype = new ConfigFileurlPrototype();
private static ConfigMultiton _configMutiton = new ConfigMultiton();
private ConfigMultiton() { }
public static ConfigMultiton GetInstance()
{
return _configMutiton;
}
public IConfigPrototype ConfigFactoryMethod(string Name)
{
IConfigPrototype _prototype =null;
switch (Name)
{
case "database":
_prototype = _configDatabasePrototype.Clone();
break;
case "fileurl":
_prototype = _configFileurlPrototype.Clone();
break;
default:
break;
}
return _prototype;
}
}
測試用例
1.初始化完成後,Multiton中的元素準備完畢,如圖

2.通過IConfigPrototype中的約定的方法調用可以獲取Name和Value,如圖

3.測試用例如下,圖中那麼多都是Prototype的副本~

[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
IConfigPrototype _temp = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp1 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp2 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp3 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp4 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp5 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp6 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp7 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp8 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp9 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp10 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp11 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp12 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp13 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp14 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp15 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp16 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp17 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp18 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
IConfigPrototype _temp19 = ConfigMultiton.GetInstance().ConfigFactoryMethod("fileurl");
IConfigPrototype _temp20 = ConfigMultiton.GetInstance().ConfigFactoryMethod("database");
}
}
代碼下載
http://files.cnblogs.com/files/aaron-clark-aic/PrototypeFactoryMethodMultiton-Config.zip
Note: 點讚的隨意,點反對的留言
模式的混合-我們真的需要一次一次的讀配置嗎-MultitonPrototypeFactoryMethod的更多相关文章
- 依赖注入及AOP简述(八)——混合请求模式 .
2.3. 混合请求模式 上一节讲到了FQCN(全类名)请求模式会带来依赖定义的柔软性较差的问题,因此字符串和全类名混合的模式又应运而生了.比如刚才的Spring中的API方式声明注入点的例子就可 ...
- HybridStart混合应用开发框架
转自我的博客,原文地址:http://refined-x.com/2017/06/26/%E5%9F%BA%E4%BA%8EAPICloud%E7%9A%84%E6%B7%B7%E5%90%88%E5 ...
- 混合开发框架Flutter
Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...
- linux虚拟机网络连接模式 bridged, host-only, NAT
最近安装了fedora9.0,却一直不能连接到外网,我用的是3G无线网卡上网的,起初以为是linux不支持3G无线方式的,可后来装了虚拟机ubuntu却可以上网,在后来用有ADSL网络连接的电脑安装f ...
- apache 三种工作模式的讲解
Apache 2.X 支持插入式并行处理模块,称为多路处理模块(MPM).在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速 ...
- java设计模式--行为型模式--迭代模式
迭代器模式 概述 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 .访问一个聚合对象的内容而无需暴露它的内部表示. .支持对聚合对象的多种遍历 ...
- 经典CSS颜色混合模式
转自:http://www.webhek.com/css-blend-mode/ 注意:只有使用最新版的谷歌浏览器.火狐浏览器,才能正确的显示本文中的演示. Photoshop里最没有用处的一种功能— ...
- XCode工程中ARC模式与非ARC模式共用(转)
Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外, ...
- 浅析Unity中的Enlighten与混合光照
0x00 前言 在Unity的5.6版本之前的5.x中,主要使用了Geomerics公司的Enlighten[1]来提供实时全局照明以及烘焙全局照明,在5.6之后Unity引入了新的Lightmapp ...
随机推荐
- Lock,LockFree,MemoryBarrier,ConcurrentCollection
最近看并行编程书本的一些心得,简单记录下多线程和并行编程必知必会的几个概念,再次加深自己的理解. .NET Framework4提供了一个新的命名空间System.Collections.Concur ...
- JMS确认机制
JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制 J2EE中JMS确认机制 在JMS规范中一共4种确认方式 AU ...
- webservice5
如何访问webservice . 三种方式我知道, 但是, 方式1 只说明了如何访问wsdl, 不知道如何调用,现在就是需要知道如何像下面url描述一样 , http get .post 方式调用ws ...
- Javascript模块化编程笔记
最近在读阮一峰的博客http://www.ruanyifeng.com/blog/2012/10/javascript_module.html,随手记录一些重要笔记. Javascript模块的雏形 ...
- Repeater绑定数组并显示其值
web开发中,尤其是对于数据展示,不得不说Repeater是一个万能的控件,而且使用也很方便. 在ASP.NET中将数组绑定到Repeater中请问如何在Repeater前台页面中显示该数组的值? s ...
- Redis学习笔记~关于空间换时间的查询案例
回到目录 空间与时间 空间换时间是在数据库中经常出现的术语,简单说就是把查询需要的条件进行索引的存储,然后查询时为O(1)的时间复杂度来快速获取数据,从而达到了使用空间存储来换快速的时间响应!对于re ...
- Atitit.软件中见算法 程序设计五大种类算法
Atitit.软件中见算法 程序设计五大种类算法 1. 算法的定义1 2. 算法的复杂度1 2.1. Algo cate2 3. 分治法2 4. 动态规划法2 5. 贪心算法3 6. 回溯法3 7. ...
- paip.lucene 4.3 中文语义搜索最佳实践
paip.lucene 4.3 中文语义搜索最佳实践 首先一个问题是要不要使用lucene 自带的分词器...我觉得最好不使用哪自带的分词器.效果还凑火,就是不好控制... 先使用ik,ict,mms ...
- Jasmine入门(结合示例讲解)
参考: http://www.cnblogs.com/wushangjue/p/4541209.html http://keenwon.com/1191.html http://jasmine.git ...
- IIS集成模式下,URL重写后获取不到Session值
近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的mod ...