- 浏览: 475049 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
oreilly的《Head.First设计模式》,《深入浅出设计模式》是一本好书,用生动的语言讲解设计模式。而且是逐级深入,并没有一上来就gof23,就一大套设计模式的理论。而是用例子切入,使得读者逐步的理解设计模式的好处,理解设计模式可以解决的问题,使我们有了继续读下去的理由和勇气,而不至于被大片的理论所击倒。
更加容易入门,为以后读那些理论打下坚实的基础。
感谢作者写出一本这么好的书。
设计原则一:
找出应用中可能需要变化的地方,把他们独立出来,不要和那些不需要变化的代码混合在一起。
把会变化的部分取出来“封装”起来,以便以后可以轻易的修改和扩展此部分,而不会影响不需要变化的部分。
单一职责原则。
设计原则二:
针对接口编程,而不是针对实现编程。
针对接口编程,这里的接口是广义的接口,不止包括语法中的接口interface
{
void Fly ();
}
还包括抽象类,其实就是一个超类型,反正不是具体的实现类,这样就可以利用多态,不会被绑死到一种具体的类型和实现上。这句话也可以解释为变量的声明应该是超类型,通常是一个抽象类或者是一个接口,因此只要是实现了超类的具体类产生的对象,都可以赋值给这个变量。
{
public abstract void MakeSound();
}
public class Dog : Animal
{
public override void MakeSound()
{
bark();
}
public void bark()
{ }
}
public class Cat : Animal
{
public override void MakeSound()
{
meow();
}
public void meow()
{ }
}
针对实现编程的调用代码
{
Dog dog = new Dog();
dog.bark();
}
针对接口编程的调用代码
{
Animal a = new Cat();
a.MakeSound();
}
在上面的代码中Animal a = new Cat();动物的创建还是被硬编码了,我们还可以在代码运行的时候再来指定创建的类型,就是我们不关心创建的类型是什么,只要可以进行makesound就可以了。方法有很多,常见的就是利用一个工厂类,将对象的创建交给工程类来完成,只要告诉它需要创建的对象的特征即可。这里我们简单的使用对象的类型名称代表对象。
简单工厂类
{
public static Animal CreateAnimal(string type)
{
switch (type)
{
case "dog":
return new Dog();
break;
case "cat":
return new Cat();
break;
default:
return null;
break;
}
}
}
调用方
{
Animal a = AnimalFactory .CreateAnimal ("cat");
a.MakeSound();
}
但是我们还是在工厂方法中看到了switch或者是很多的if。。。else。。。,如果有新类型添加,这个静态方法还是要不断的添加,越来越长,就会不符合OPC原则,有什么更好的办法吗?
答案是:有。
我们可以将系统现有的类型都预先创建出来,然后再外部调用静态方法的时候,给他需要的对象就可以了。
{
private Dictionary<string, Animal> _animals;
private AnimalFactory()
{
_animals = new Dictionary<string, Animal>();
_animals.Add("dog", new Dog());
_animals.Add("cat", new Cat());
}
private static AnimalFactory _instance = new AnimalFactory();
private static object _lockObj = new object();
public static AnimalFactory GetInstance()
{
if (_instance == null)
{
lock (_lockObj)
{
if (_instance == null)
_instance = new AnimalFactory();
}
}
return _instance;
}
public Animal CreateAnimal(string type)
{
return _animals[type];
//switch (type)
//{
// case "dog":
// return new Dog();
// break;
// case "cat":
// return new Cat();
// break;
// default:
// return null;
// break;
//}
}
}
调用方代码
{
Animal a = AnimalFactory.GetInstance () .CreateAnimal ("cat");
a.MakeSound();
}
我们先创建一个字典,作为容器,预先放置了全部的类型及其类型名称,然后再需要的时候取一个出来就可以了。如果有新类型添加,也不用每次都添加一个if或者是case了,只要修改工厂方法的静态构造函数,在字典中添加新元素就可以了。
这时候有些人会觉得这里好像很眼熟,对了,就是容器,IOC容器,依赖注入,我们不知不觉的重构到了IOC容器。IOC容器就是一个类似字典的东西,使得你事先可以注册很多的类型在里面,设置好这些类型的映射关系,配置好容器之后,容器中就会有很多的类型实例,然后再用容器的Resolv方法来获取指定类型的实例,而不用new方法来创建了。
而且上面最后的工厂类,我们还使用了单件模式以及简单工厂模式。
类型的注册可以采用代码编写,就好像向字典中添加元素一样。也可以采用xml配置文件,更加灵活。
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 525如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 626组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 494本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5585 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 578前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 804企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 594首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 550概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 962概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 772我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 7951 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9481、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 736引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 578经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 602今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 647我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 789题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 670今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 638题外话 又是一本Head.First系列的书,这个系列 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(二)
2010-07-20 07:18 657今天的话题是收集需求。 Gathering Requi ...
相关推荐
对话框乱弹的小程序,点击开始后会不停弹300个大小不等位置不确定的对话框,伴随windows的一些报警声,很有节奏的感觉。
使用fiddler工具进行抓包,使用python进行osc乱弹抢沙发
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》-论文.zip
into沙龙第期康国庆乱弹传统企业转型以及与互联网结合的方式PPT教案.pptx
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.zip
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.doc
机器学习课程讲义.zip
Z-Blog博客系统是一款很好的一款博客系统,该系统源码比较简单,附件增强:增强附件功能,统计附件下载次数,防盗链等。高级侧栏:加几个新侧栏上去,微信公众平台,Z-Blog连接微信公众平台,静态管理中心,控制...
修复单类代码生成器4个问题。 2.新增创建加载数据库时,表名过滤功能。 3.表名生成命名规则,字符串替换功能。 4.模板中字段排序方法公开。 5.字段默认值函数的处理。 6.导出的sql脚本中,单引号 '的问题。...
Ajax是一种已不是加载脚本,其最古老的实现方式是利用iframe来加载远程的脚本利用top.Function来调用父窗体的方法。利用a等HTML的target属性来指定。简单但是后期维护复杂化了并且在跨越方面很麻烦。接着就...
Vb恶搞程序,逗您玩,关不完的消息框(弹出窗口),其实是能关掉的,只要你一直点下去,而且到最后还可以看到传说中的比尔盖茨,哈哈。程序是个小恶搞程序,对你的系统不会造成任何伤害,只是玩玩的,源代码开源。
乱弹餐馆“菜单”的设计 202 提一个懒人需求——找遥控器的电视 203 谈一下清华的道路设计 204 产品说明书的最佳位置 205 信息整理后的火车票视觉结构 207 第18章 UCD年会主题分享 211 UCD2009《从用户出发》的主要...
阿尔法虚拟桌面软件是一款桌面工具老板同事来身后了,不想被他们知道自己正在打理网店?有事离开电脑一会儿,不想被别人知道自己正在干嘛?使用软件群发时乱弹窗口很讨厌?一个桌面打开程序太多放不下了?您可以使用...
6.1. 有了它,我们就可以摆脱那些自称ui设计师的人了。 6.2. 关于BorderLayout 6.3. 嗯,不如再看看附加效果 6.3.1. 先看看split 6.3.2. 再试试titlebar 6.3.3. 还不够,还不够,让四周的区域可以缩起来 ...
“如果一群猴子在打字机上乱弹,他们可能会在大英博物馆里写所有的书。” monkeys是一个旨在使Python中的基因编程易于访问,快速,灵活和有趣的框架。 。 什么是基因编程? 遗传编程算法是一类进化算法,其中...
进行编译,并嵌入到可执行文件中去pyHook-1.5.1.win32-py2.7
6.1. 有了它,我们就可以摆脱那些自称ui设计师的人了。 6.2. 关于BorderLayout 6.3. 嗯,不如再看看附加效果 6.3.1. 先看看split 6.3.2. 再试试titlebar 6.3.3. 还不够,还不够,让四周的区域可以缩起来 6.3.4...
6.1. 有了它,我们就可以摆脱那些自称ui设计师的人了。 6.2. 关于BorderLayout 6.3. 嗯,不如再看看附加效果 6.3.1. 先看看split 6.3.2. 再试试titlebar 6.3.3. 还不够,还不够,让四周的区域可以缩起来 6.3.4. 给...