先看看什么是单例模式。 单例模式的存在在一些情况下是比较有意义的,如BlogEngine的站点配置就是采用的单例模式,而且它的载入和保存的代码是相当经典的,有兴趣可以看看它的源代码。 由于asp.net是编译型的,所以单例一直会存在于这个应用程序的生命周期里,真正可以做到这个实例在应用程序生命周期中的唯一性。 php的单例模式的实现大致如下: 代码来自:http://www.cnblogs.com/cocowool/archive/2009/03/18/1415660.html 但,PHP是一种解释型的语言,在这里用单例好像看不出实际的用处,一旦整个页面执行完,变量也就消失了。 我接触PHP时间不长,以上写出来的只是在C#与PHP二种不同语言环境下对单例模式的认知,也许这个例子只是为了说明模式可以用很多种语言来实现,但并不意味着在各种语言环境下都能真正起作用。 asp.net中的单例是在整个应用程序域唯一。PHP中的单例只在整个页面周期内唯一
Browsing the archives for the 设计模式 tag
Component抽象组件,在以下例子中为Photo类ConcreteComponent具体组件,在以下例子中为MyPhoto类,继承自Photo类 Decorator装饰者抽象组件,在内部维护一个Photo的实例装饰者组件也继承自Photo类,以下例子中为PhotoFrame抽象类ConcreteDecorator具体装饰者,如矩形相框、椭圆相框等。在重写Photo类相关方法的同时,会附加其它的方法 class Program { static void Main(string[] args) { //先创建一个影集 Photo photo = new MyPhoto(“黄山之行影集”); //用一个矩形相框装饰它 photo = new RectangleFrame(photo); //再用一个椭圆相框装饰它 photo = new EllipseFrame(photo); photo.GetDescription(); } } /// <summary> /// 相片基类 /// </summary> public abstract class Photo { public Photo() { } protected string _description = “未命名”; public Photo(string description) { _description = [...]
意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 Target定义一个目标接口,可以是一个接口也可以是一个抽象类.Adapter适配器类,它要实现目标接口且维护一个被适配对象的实例.Adaptee被适配对象Client客户端调用很典型的例子就是笔记本电脑的电源适配器,它通过适配器将直流电转化为笔记本电脑所需的标准电压. class Program { static void Main(string[] args) { ITarget t = new Adapter(new Adaptee()); t.WriteEvent(DateTime.Now.ToString()); Console.Read(); } } /// <summary> /// 目标接口 /// </summary> interface ITarget { void WriteEvent(string msg); } /// <summary> /// 适配器类,它要实现目标接口且维护一个被适配对象的实例 /// </summary> class Adapter : ITarget { Adaptee adaptee; public Adapter(Adaptee a) { adaptee = a; } /// [...]
定义:提供一个统一的接口去访问多个子系统的多个不同的接口。外观模式定义了一个高层次的接口,使得子系统更容易被使用。 UML示意图 外观类1、知道哪些子系统,知道处理哪些请求2、将客户的请求传递给子系统处理 子系统类1、实现了子系统的功能2、处理由外观类传过来的任务3、子系统无需知道外观类,在任何地方也没有引用外观类。 现实中的例子: 我们去餐厅吃饭,只需将菜单传递给服务员即可。服务员就是这里的外观类,服务员会将请求传递给厨房里的厨师、传菜工等服务生。以下代码取自DoFactory using System; namespace DoFactory.GangOfFour.Facade.Structural { //客户端调用 class MainApp { public static void Main() { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); Console.Read(); } } // 子系统1 class SubSystemOne { public void MethodOne() { Console.WriteLine(” SubSystemOne Method”); } } // 子系统2 class SubSystemTwo { public void MethodTwo() { Console.WriteLine(” SubSystemTwo Method”); [...]