`
txf2004
  • 浏览: 6852387 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C#描述设计模式(2):工厂模式学习心得及我的项目应用

阅读更多

工厂模式学习心得及我的项目应用

一、学习笔记:

下面的例子参见TerryLee的Blog。

应用场景:(1个场景的若干要点)

1。工资核算系统。
2。工资=奖金+税收+4000(基本工资)。这个公式各国通用。
3。其中,奖金=4000×0.2;税收=4000×0.1
4.将要面临的变化点:若软件应用到了美国。美国的工资也是 工资=奖金+税收+4000(基本工资)。
但是美国的奖金=工资×0.4;税收=奖金×0.2;
5.更加难度的变化:不知道以后会卖到哪个国家,也不知道未来国家的奖金和税收的计算方法。

设计经历:

1 第一次设计:

当系统实现“应用场景4”(即从中国转移到美国)时候,需要修改Client类。 
/*尚未搞懂的问题,就是如果Client调用的方法为 ITax tax= new ChineseTax(); 
那么,ChinesTax类中的特有方法――并非从接口实现的方法,就无法调用了。
还是说,我本身对“接口”这个定义的理解就有错误,实现接口的类,最好没有自己特有的方法。
*/ 

2 第二次设计

增加了Factory:

说明:factory帮助Client选择到底是哪个Tax和Bonus。这时候的工厂其实是一个具体工厂。
当系统实现“应用场景4”(即从中国转移到美国)时候,需要修改Factroy类。 

3.第三次设计

将工厂变化为抽象工厂

/*说明:映射的代码:

stringfactoryName=Constant.STR_FACTORYNAME.ToString();
AbstractFactoryinstance;
if(factoryName!="")
instance
=(AbstractFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
*/ 当系统实现“应用场景4”(即从中国转移到美国)时候,需要修改配置文件。
当系统实现“应用场景5”(增加另外一个国家)时候,需要修改配置文件。

二、学习心得:

抽象工厂的缺陷(尚不确定):

1.上个例子中的ChineseTax不能有自己独立的方法,只能有ITax的中所继承到的方法。 
2.要创建很多工厂,类的数量增多。

三、项目应用应用场景:(1个)

1。公司网站系统。
2.在这个系统中,有如下几个类:用户、新闻、通知、留言、案例、站内信
3 由于系统比较简单,每个类都只有增、删、改、查四个方法就够了。
4 网站前台用于展示,后台用于修改、删除。
5 网站的前台基本都是2种页面:多条记录页面(主体是一个GridView),单条记录页面(用于显示明细);
网站后台基本上是2个页面:多条记录页面(主要用来删除和搜索),单条记录页面(主要用来修改和添加)。
6 需要改进的地方:现在我们给“文章”写了一个前台的“多条记录页面”,

给通知写了一个前台的“多条记录页面”,给留言写了一个前台的“多条记录页面”,
给站内信写了一个前台的“多条记录页面”。。。但是代码重复的地方非常多:
每个页面都要给GriedView写一个翻页的方法,每个页面都是在PageLoad()方法里面绑定数据。
后台也一样。现在希望改进网站代码,
不需要这么多页面。用一个页面统一显示多条记录,用一个页面统一显示详细页面。。。后台页面同理。
7 难点:每个页面不重复的代码在于每个GriedView的绑定列不同。单条记录页面的绑定字段不同。

解决方案:

每个页面通过读取URL字符串,获取一个信息――该页要显示什么,并且动态配置该页。

每个页面的需要变化的控间通过读取URL的字符串,获取一个信息――该如何显示。

下面给出了类图:(以多条列表页面为例子、多条列表页面的GridView控件为例子。

其实每个页面都应该有一个工厂,页面上每一个需要变化的页面都需要一个工厂。)

说明:

1。对页面来说,应该传布局信息;对于控件来说,应该传数据信息 
2。如何绑定GriedView: Select()方法返回一个IList,用于数据返回。
而每个IList都是一个BaseProperty的数组,里面有一个BindMessage属性,
返回的是一个String,表示一个xml的路径,这个xml表示的是对GriedView的绑定列的规则。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics