- 浏览: 495445 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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)
今天给大家带来的是:工厂模式。
我们在代码中创建一个对象,我们会很自然的想到new。其实,除了new意外,我们还有很多的方式可以创建对象。不说复杂的模式,就说简单的语法,其实.NET框架中还有下面的方法。根据需要创建的对象的类型,动态创建对象。
通过前面我们已经讲过一条原则:
针对接口编程,不针对实现编程。
使用new创建对象很明显就是一个针对实现编程,new后面需要一个具体的类,不允许你new一个接口或者是抽象类。包括用Activator.CreateInstance都不能创建接口或者抽象类。
那是不是就是说以后不能或者是不要再用new了,都用其他方式吗?
也不是的,也要根据情况来分析,不是一概而论的,在后面会给出一些简单的标准,更多的要结合具体的设计定夺。
很多时候我们会碰到下面的代码:
if (userType == "admin")
{//创建管理员
}
else if (userType == "supervisor")
{//创建超级管理员
}
else if (userType == "coommon")
{
//创建普通用户
}
如果以后增加了用户的类型,不仅要创建用户类型实体,还需要打开创建用户的这段代码,后面加上一个if。。。else。。。。
如果这段代码没有封装,就更麻烦了,散落在项目的各处,每个地方都要打开,ctrl+c,ctrl+v。开始了无尽的噩梦。
对于后面的维护成了问题,而且违反了一条原则:
OCP原则,对增加开放,对修改封闭。
首先使用封装变化原则对这段代码做一些抽象,上面这段明显是变化较多的地方,其他的代码可能是现实创建的用户的姓名之类的。变成一个方法,然后将用户类型定义为enum类型,减少调用者由于输入错误导致程序错误。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.DesignPattern.Head.First.Factory
{
public enum UserType
{
Admin,
Supervisor,
Common
}
public abstract class User
{
public virtual UserType UserType
{
get;
protected set;
}
public User(UserType userType)
{
UserType = userType;
}
public virtual string Username
{
get;
set;
}
public virtual int Age
{
get;
set;
}
public virtual void DisplayName()
{
Console.WriteLine("my name is {0}, i'm {1} years old.", Username, Age);
}
}
public class AdminUser : User
{
public AdminUser()
: base(UserType.Admin)
{ }
}
public class CommonUser : User
{
public CommonUser()
: base(UserType.Common)
{ }
}
public class SupervisorUser : User
{
public SupervisorUser()
: base(UserType.Supervisor)
{
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BeautyCode.DesignPattern.Head.First.Factory
{
public class UserFactory
{
public static User CreateSingleUser(UserType userType)
{
User user = null;
switch (userType)
{
case UserType.Admin :
user = new AdminUser();
break;
case UserType.Common :
user = new CommonUser();
break;
case UserType.Supervisor :
user = new SupervisorUser();
break;
default :
break;
}
return user;
}
}
}
调用代码
以后增加新的用户类型就不用在各处修改了,只要新建一个类型实体,然后打开工厂方法,修改一下就可以了。
有没有更好的呢?
能否只是增加一个用户类型实体类呢?
答案是:能
修改一下工厂方法,利用泛型和Activator
{
T user = null;
user = Activator.CreateInstance<T>();
return user;
}
调用者的代码修改为
有没有更好的呢?
期待大家的参与讨论!!!!
其实我这个还不算是真正意义上的工厂模式,顶多算是个简单的工厂,后面我会补充一些更好的例子。
感谢大家耐心看完本篇博文。
定义
工厂模式:定义了一个创建对象的借口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。
上面的描述中提到了“子类决定”的决定,希望不要错误理解,不是模式允许子类本身在运行的时候做决定,而是指在编写创建者类的时候,不需要知道实际创建的类是哪一个。调用者选择使用哪个类,自然就决定了实际创建的对象。
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 547如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 668组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 527本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5895 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 613前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 835企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 623首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 593概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 994概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 801我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8371 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9681、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 777引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 649oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 604经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 632今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 681我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 670题外话 又是一本Head.First系列的书,这个系列 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(二)
2010-07-20 07:18 681今天的话题是收集需求。 Gathering Requi ...
相关推荐
包含以下文件: Java设计模式-图解-附代码.pdf 从Java类库看设计模式.doc 六大UML类图关系.docx 认识UML类图元素_java之UML.doc 设计模式6大原则.doc 设计模式学习笔记.doc 深入浅出设计模式(中文版).pdf
该资料介绍Java各类开发模式,包含以下教程:《深入浅出设计模式(中文版)》《Java单例模式》《Java设计模式-图解-附代码》《JAVA设计模式之单例模式(完整版)》《Java学习笔记(必看经典)》《Java总复习》《单例模式》...
这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了设计模式这一复杂的主题。设计模式是软件工程中经过实践验证的解决方案,用于解决在面向对象设计中常见的问题。 本书包含23种经典的设计模式,这些...
总之,《Java设计模式第2版中文版》是一本涵盖全面、深入浅出的教程,无论是初学者还是经验丰富的开发者,都能从中受益。通过学习这本书,你可以提升自己的编程思维,写出更优雅、更健壮的代码,为团队协作和项目...
"读书拉.htm"可能是书中的一些笔记或阅读指南,"深入浅出 MFC_华中理 工_简体版.pdf"是主要的教材内容,"dushula.txt"可能是读者在阅读过程中的个人感悟或摘录,这些资源结合起来,将构成一个全面的MFC学习资料库。...
这本书以其深入浅出的讲解方式,详尽地介绍了Java语言的各个方面。它不仅包含基本语法,还涉及设计模式、泛型、并发编程等高级话题,是进阶Java开发者的必读之作。中文版的提供使得中文读者能够无障碍地学习这本权威...
2012-06-12 11:55 3,721,136 VC++动态链接库(dll)编程深入浅出.rar 2012-06-12 13:02 23,185 VC++图像平滑处理+程序.rar 2012-06-12 12:12 45,056 VC++操作INI配置文件的实现.doc 2012-06-12 11:48 11,728,284 VC++...
通过以上概述,我们可以看到《Effective C++(中文版)》不仅是一本技术手册,更是一部深入浅出地介绍C++编程精髓的作品。无论是初学者还是有一定经验的开发者,都能从中受益匪浅。阅读这本书不仅可以帮助我们提高...
这本书深入浅出地介绍了Go语言的设计理念、语法特性和实际应用,旨在帮助读者快速掌握Go语言并能进行高效的编程实践。 Go语言,由Google公司的Robert Griesemer、Rob Pike及Ken Thompson等人设计开发,于2009年公开...
这本书以易理解的图文并茂的形式,深入浅出地讲解了这两个重要技术。 Servlet是Java编程语言中的一个接口,用于扩展服务器的功能,特别是Web服务器。它允许程序员创建动态、交互式的HTTP服务。Servlet可以处理...
- JavaEE进阶之Spring事务深入浅出:虽然Spring是Java EE的一个补充框架,但它的事务管理部分在企业级应用中非常重要,值得深入学习。 - J2EEWeb应用开发技术教材:Web层的开发是Java EE应用中的关键部分,学习如何...
这本书以其深入浅出的讲解方式和全面的内容覆盖,成为了学习Java语言的重要参考书籍。中文版的出现使得更多的中国读者能够无障碍地理解和掌握Java编程精髓。 在描述中提到,“非扫描”意味着这是一份正式授权的电子...
总的来说,《Java并发编程实战》中文版是一本深入浅出的并发编程指南,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的知识和启示。通过学习书中的内容,你将具备驾驭Java并发编程的能力,写出更健壮、高效...
《深入浅出Android--Google手持设备应用程序设计》下载 《Android编程指南》android-book.pdf 下载 《Android应用开发揭秘》PDF高清版下载 游戏项目分享——忍者突袭 只发精品——分享一个短信应用源码 百度地图...
8. **侯捷译本**:侯捷是中国知名的软件技术专家,他的翻译风格深入浅出,使得原书的概念和方法论更加贴近中文读者的理解。 9. **超星版**:超星版通常指的是电子版,可能包含了一些电子阅读特有的标记或格式,方便...
4. Android 深入浅出:包括 Android 的设计模式、架构设计、性能优化、安全机制等高级技术。 5. Android 开发入门与实践:涵盖 Android 开发的基础知识和实践操作,包括 Android Studio 的使用、 Android 项目结构...
“大话”在中文里通常用来形容深入浅出地讲述复杂话题,这里的“大话练法”可能是作者以轻松幽默的方式讨论编程技巧和职业发展路径的一种方式。在IT行业,不断学习和提升技能是每个从业者必须面对的挑战,而这本书很...
这份手册深入浅出地讲解了Cisco路由器的工作原理、配置步骤以及常见问题的解决方法,是了解和掌握网络基础特别是Cisco技术的宝贵资料。 在【描述】中提到,"Cisco路由手册中文非常适合新手学习",这意味着手册以...