服务器在无盘网吧的现在与将来(3)
2008-06-29 23:50
239 查看
工厂模式与抽象工厂模式,相信同行不会陌生.在网上及相关书里面也看过这方面的介绍(推荐这两本书:Steven John Metsker's Design Patterns in C# 和 Gof's Design Pattern Framework2.0).今天抽点时间,写点这方面的东西,希望能起到一点抛砖引玉的作用.
工厂模式与抽象工厂模式是应用得比较多的构造型模式,先简单的介绍一下这种构造模式的应用背景:
在开发一个类的过程中,我们一般都要为这个类开发相应的构造函数(不过大部分情况下,.NET开发环境会自动默认创建构造函数),这样,使用这个类的客户可以利用构造函数对这个类进行实例化.但是,有时候会出现这种情况:需要使用一个对象的客户并不知道(或者不应该知道)应该对几个类中的哪个类进行初始化.面对这个问题,我们可以利用工厂模式定义一个接口,客户可以使用这个接口创建一个对象.同时我们还可以控制对哪个类进行实例化,实例化过程使用了一个方法,这个方法需要利用外部因素来确定对哪个类进行实例化.有时候,这些外部因素就是一个庞大的研究主题,并且往往会涉及到多个类.为此,抽象工厂模式就应用于这种场合,其目的是为了提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类”,至少“无需指定它们具体的类”符合我们的要求。
下面就Gof's Design Pattern Framework2.0中的一个UML class diagram及一个通俗易懂的例子来说明一下:
这个图比较形象直观,能很清楚的看出抽象工厂与工厂以及客户之间的关系.
下面就举个例子来看看:
假如我的程序中有需要一系列的对象,比如bed,desk,chair…, 要想利用他们,我们就必须在程序中根据用户要求,然后一个个调用 new 操作符来生成他们,这样客户程序就要知道相应的类的信息,生成的代码显然不够灵活。再此它们显然是一类的,都是furniture,既然如此,我们只要一个生产家具的工厂就可以.我们可以在代码中不利用具体的类,而只是说明我们需要什么,然后就能够得到我们想要的对象.
先定义一个类,主要声明一个家具接口,床和椅子的类:
Public interface IFurniture
{
}
public class Bed:IFurniture
{
public Bed()
{
Console.WriteLine("I need a bed!");
}
}
public class Desk:IFurniture
{
public Desk()
{
Console.WriteLine("I need a desk!");
}
}
public class Chair:IFurniture
{
public Chair()
{
Console.WriteLine("I need a chair!");
}
}
再定义一个家具工厂的类(可以利用反射机制中Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用System.Activator创建对象):
public class FurnitureFactory
{
public IFurniture MakeFurniture(string Name)
{
IFurniture MyFurniture = null;
try
{
Type type = Type.GetType(Name,true);
MyFurniture = (IFurniture)Activator.CreateInstance(type);
}
catch (TypeLoadException e)
Console.WriteLine("I dont know this kind of furniture,
exception caught - {0}" ,e.Message);
return MyFurniture;
}
}
然后在以客户端进行程序调用:
string FurnitureName = Console.ReadLine();
IFurniture MyFurniture;
FurnitureFactory MyFurnitureFactory = new FurnitureFactory();
MyFurniture = MyFurnitureFactory.MakeFurniture(FurnitureName);
就这样预期想实现的,通过这样就实现了.当然这个例子比较简单,但是它却通过工厂模式的思想实现了代码的灵活性.应用软件系统开发中,有许多地方可以考虑使用工厂模式.比如在写数据层的代码时候,考虑到程序的可移植性,可拓展性,面向不同的数据库时,采用工厂模式不为是一件理想的实现方式.本文出自 “男人不再沉默” 博客,请务必保留此出处http://zhanghf.blog.51cto.com/193856/33327
工厂模式与抽象工厂模式是应用得比较多的构造型模式,先简单的介绍一下这种构造模式的应用背景:
在开发一个类的过程中,我们一般都要为这个类开发相应的构造函数(不过大部分情况下,.NET开发环境会自动默认创建构造函数),这样,使用这个类的客户可以利用构造函数对这个类进行实例化.但是,有时候会出现这种情况:需要使用一个对象的客户并不知道(或者不应该知道)应该对几个类中的哪个类进行初始化.面对这个问题,我们可以利用工厂模式定义一个接口,客户可以使用这个接口创建一个对象.同时我们还可以控制对哪个类进行实例化,实例化过程使用了一个方法,这个方法需要利用外部因素来确定对哪个类进行实例化.有时候,这些外部因素就是一个庞大的研究主题,并且往往会涉及到多个类.为此,抽象工厂模式就应用于这种场合,其目的是为了提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类”,至少“无需指定它们具体的类”符合我们的要求。
下面就Gof's Design Pattern Framework2.0中的一个UML class diagram及一个通俗易懂的例子来说明一下:
这个图比较形象直观,能很清楚的看出抽象工厂与工厂以及客户之间的关系.
下面就举个例子来看看:
假如我的程序中有需要一系列的对象,比如bed,desk,chair…, 要想利用他们,我们就必须在程序中根据用户要求,然后一个个调用 new 操作符来生成他们,这样客户程序就要知道相应的类的信息,生成的代码显然不够灵活。再此它们显然是一类的,都是furniture,既然如此,我们只要一个生产家具的工厂就可以.我们可以在代码中不利用具体的类,而只是说明我们需要什么,然后就能够得到我们想要的对象.
先定义一个类,主要声明一个家具接口,床和椅子的类:
Public interface IFurniture
{
}
public class Bed:IFurniture
{
public Bed()
{
Console.WriteLine("I need a bed!");
}
}
public class Desk:IFurniture
{
public Desk()
{
Console.WriteLine("I need a desk!");
}
}
public class Chair:IFurniture
{
public Chair()
{
Console.WriteLine("I need a chair!");
}
}
再定义一个家具工厂的类(可以利用反射机制中Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用System.Activator创建对象):
public class FurnitureFactory
{
public IFurniture MakeFurniture(string Name)
{
IFurniture MyFurniture = null;
try
{
Type type = Type.GetType(Name,true);
MyFurniture = (IFurniture)Activator.CreateInstance(type);
}
catch (TypeLoadException e)
Console.WriteLine("I dont know this kind of furniture,
exception caught - {0}" ,e.Message);
return MyFurniture;
}
}
然后在以客户端进行程序调用:
string FurnitureName = Console.ReadLine();
IFurniture MyFurniture;
FurnitureFactory MyFurnitureFactory = new FurnitureFactory();
MyFurniture = MyFurnitureFactory.MakeFurniture(FurnitureName);
就这样预期想实现的,通过这样就实现了.当然这个例子比较简单,但是它却通过工厂模式的思想实现了代码的灵活性.应用软件系统开发中,有许多地方可以考虑使用工厂模式.比如在写数据层的代码时候,考虑到程序的可移植性,可拓展性,面向不同的数据库时,采用工厂模式不为是一件理想的实现方式.本文出自 “男人不再沉默” 博客,请务必保留此出处http://zhanghf.blog.51cto.com/193856/33327
相关文章推荐
- 服务器在无盘网吧的现在与将来(1)
- 服务器在无盘网吧的现在与将来(2)
- 网吧无盘服务器从30台----115台的经验(二)
- 我是开网吧的,以前是专门上网,只加了少量的游戏,现在我想做一个专门的游戏网 上网我以前服务器装的是NT4。0版,服务器的配置
- 网络服务器kickstart+pxe 无盘安装linux系统
- 浏览器功能一览:IE曾经垃圾,现在垃圾,将来仍然很垃圾
- 网吧电影服务器解决方案完全指南
- 无盘实用技术(一):详尽的服务器硬盘测试方法(转)
- 讲座”视频编解码技术简介:过去、现在及将来“
- 做无盘网吧系统的详细步骤(四)
- 金士顿无线网络驱动器内部监督办公室的Wi-Fi无线加载服务器现在发货
- 锐起无盘服务器与客户端设置
- 曾经、现在、将来
- 网吧简单服务器的安全铺设
- CentOS6.4-x86_64搭建cobbler+kickstart的网络无盘启动服务器
- 将来的你一定会感谢现在奋斗的自己
- 网吧无盘改造纪实
- 过去,现在和将来
- 网吧服务器设置全攻略
- 2013 HTML5中国峰会演讲:Android上的HTML5:过去,现在和将来