最常用的设计模式

http://www.cnblogs.com/fora/archive/2011/04/29/2032829.html

最常用的设计模式

最常用的设计模式
设计模式通常是对于某一类的软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要充分利用已有的软件开发经验。

最常用的设计模式根据我的经验我把我经常用到的设计模式在这里做个总结,按照我的经验,它们的排序如下:1)单件模式、2)抽象工厂模式和工厂模式、3)适配器模式、4)装饰模式、5)观察者模式、6)外观模式 其他模式目前还很少用到。
单件模式
这是用的最多的模式,每一个正式的软件都要用它,全局配置、唯一资源、还有一个就是所有的工厂我都设计为单件模式,因此它的使用量大于工厂模式和抽象工厂模式之和。是用来创建一个需要全局唯一实例的模式。只是需要纠正一点。singleton模式中,构造函数应该是protected.这样子类才可以扩展这个构造函数。

单件模式主要应用在以下场合:
1. 对于一个类,占用的系统资源非常多。而且这些资源可以被全局共享,则可以设计为singleton模式,强迫全局只有一个实例
2. 对于一个类,需要对实例进行计数。可以在createInstance中进行并可以对实例的个数进行限制。
3. 对于一个类,需要对其实例的具体行为进行控制,例如,期望返回的实例实际上是自己子类的实例。这样可以通过Singleton模式,对客户端代码保持透明。
Singleton模式是一个较为简单的模式,下面的代码就可以建立一个Singlton模式的例子,这是一个写系统日志的类,实际应用的意义在于在内存中只保存一个实例,避免开辟多个功能相同的工具类实例而耗用系统资源。当多个应用调用同一个工具类或控制类时特别有意义,建议团队开发时采用。
public class LogWriter
{
    //申明一个静态的变量,类型为类本身
    private static LogWriter _instance = null; 
    //将类的构造函数私有化,使得这个类不可以被外界创建
    private LogWriter()
    {
    }
    //提供静态的方法,创建类的实例
    public static LogWriter GetInstance()
    {
        if (_instance == null)
        {
            _instance = new LogWriter();
        }
        return _instance;
    }
}
分析:如果是多线程的情况下该如何保持单件模式?
A: 多线程时应该也是单件的吧,因为线程之间是共享内存的。
请问要是我想限制实例个数不超过10个 应该怎么办呢? 
A: 做个类似线程池的东西吧
多线程下面也可以用,可以有很多种方法
1、对静态方法进行同步,2、急切创建实例,3、双重检查加锁
public class Singleton {
  private volatile static Singleton singleton ;
  private Singleton () {}
  public Singleton ( String name ) {}
  public static Singleton getInstance () {
  if ( singleton == null ) {
    synchronized ( Singleton.class ) {
    if ( singleton == null ) {
    singleton = new Singleton();
    }
    }
    }
    return singleton;
}
}
单例模式:单例的实现和上面模式演变中的最后一种很相似,只要把构造器私有便OK。
简单工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

public class SteamedBread
  {
     public SteamedBread()  // 构造方法
     { }
     private double price=0.5;
     public double Price
     {
         get { return price; }
         set { price = value; }
     }
  }
OK,产品对象建立好了,下面就是创建工厂(Factory)对象了。
  public class Factory
  {
     public static SteamedBread CreateInstance()  // 创建一个馒头(SteamedBread)对象
     {
         return new SteamedBread();
     }
  }
此时,客户端可以这样来调用:
  public class Client
  {
     public static void Main(string[] args)
     {
         //通过工厂创建一个产品的实例
         SteamedBread sb = Factory.CreateInstance();
         Console.WriteLine("馒头{0}元一个!", sb.Price);
     }
  }

工厂模式
public interface IFruit
{
}

public class Orange:IFruit
{
 public Orange()
 {
  Console.WriteLine("An orange is got!");
 }
}

public class Apple:IFruit
{
 public Apple()
 {
  Console.WriteLine("An apple is got!");
 }
}

我们的FruitFactory应该是怎么样呢?上面的结构图中它给的是CreateProductA,那好,我就MakeOrange,还有一个CreateProductB,俺MakeOrange还不行??

public class FruitFactory
{
 public Orange MakeOrange()
 {
  return new Orange();
 }
 public Apple MakeApple()
 {
  return new Apple();
 }
}

怎么使用这个工厂呢?我们来写下面的代码:

string FruitName = Console.ReadLine();
IFruit MyFruit = null;
FruitFactory MyFruitFactory = new FruitFactory();

switch (FruitName)
{
 case "Orange":
  MyFruit = MyFruitFactory.MakeOrange();
  break;
 case "Apple":
  MyFruit = MyFruitFactory.MakeApple();
  break;
 default:
  break;
}

抽象工厂模式
  示意性代码如下:
 /// <summary>
 /// 食品接口----扮演抽象产品角色
 /// </summary>
 public interface IFood
 {
     /// <summary>
     /// 每种食品都有销售价格,这里应该作为共性提升到父类或是接口来
     /// 由于我们只需要得到价格,所以这里就只提供get属性访问器
     /// </summary>
     double price{get;}
 }
 ------------------------------------------------------------------------------------
 /// <summary>
 /// 馒头
 /// </summary>
 public class SteamedBread:IFood
 {
     /// <summary>
     /// 构造方法
     /// </summary>
     public SteamedBread()
     { }
 
     public double price
     {
         get
         {
             return  0.5;
         }
     }
 }
 ------------------------------------------------------------------------------------
 /// <summary>
 /// 包子
 /// </summary>
 public class SteamedStuffed:IFood
 {
     public SteamedStuffed()
     { }
 
     /// <summary>
     /// 销售价格
     /// </summary>
     public double price
     {
         get
         {
             return  0.6;  //0.6元一个
         }
     }
 }
 ------------------------------------------------------------------------------------
 /// <summary>
 /// 工厂角色
 /// </summary>
 public class Factory
 {
     /// <summary>
     /// 创建一个馒头(SteamedBread)对象
     /// </summary>
     /// <returns></returns>
     public static IFood CreateInstance(string key)
     {
         if (key == "馒头")
         {
             return new SteamedBread();
         }
         else
         {
             return new SteamedStuffed();
         }
     }
 }
 ------------------------------------------------------------------------------------
 public class Client
 {
     public static void Main(string[] args)
     {
         //通过工厂创建一个产品的实例
         IFood food = Factory.CreateInstance("馒头");
         Console.WriteLine("馒头{0}元一个!", food.price);
 
         food = Factory.CreateInstance("包子");
         Console.WriteLine("包子{0}元一个!", food.price);
     }
 }

此时的设计就已经完全符合简单工厂模式的意图了。顾客(Client)对早餐店营业员(Factory)说,我要“馒头”,于是营业员便根据顾客所提供的数据(馒头),去众多食品中找,找到了然后就拿给顾客。 
其他模式
适配器模式
配器模式有两种类的适配器和对象适配器,对象适配器更多一些,对象适配器的优点在很多大侠的著作了已经论述n次了,我这里不多啰嗦,我用的较多的原因还有一个,我从C++转到C#,由于C#不支持多重继承,我又不比较懒,较少定义interface,因此大多数情况下用C#时也只能使用对象适配器模式了。其实适配器和装饰模式功能上有很大的相似性,在下面的装饰模式中加以论述。

装饰模式
也叫油漆工模式,装饰模式和适配器模式相似都是用来利用现成代码加以调整来满足新的需求,其实采用设计模式的目的之一就是复用,这两个模式正是复用的体现。当你要用这两种模式的时候都是为你现有软件新增新的功能,一般情况下,如果你是让你的软件新增新的功能操作,你一般要用装饰模式,你如果要为软件新增功能支持,你最好选择适配器模式,你如果想为你的类新增操作你用装饰模式,你如果要引入其他来源的现成代码,你用适配器模式。

观察者模式
这个模式我用的多一个原因就是它可以实现事件功能,当然在C#中可以直接使用事件,但是在C++中却是用可以用此模式发挥的淋漓尽致了,网上曾经的一个考题(猫大叫一声,主人醒来,耗子跑开),就是使用这个模式的最好应用。

外观模式
开发就是能复用的地方就复用,这样才能节省资源,提高效率,外观模式也是一个提供复用其他现成代码的解决方案,你需要实现一个功能,可能现成的代码中就有此功能,但是现成代码可能远远多于你所需要的功能,此时你把这些功能封装起来,再重新提供一个你所需要的接口,这就是这个模式的精髓所在。

1.静态成员:
属性,方法和字段是对象实例所特有的,静态成员可看作是类的全局对象。 静态属性和字段可访问独立于任何对象实例的数据,静态方法可执行与对象类型相关而与对象实例无关的命令。使用静态成员时,不需要实例化对象。且不能用实例来调用静态字段,属性,方法。

2.静态类:
只包含静态成员,不能实例化,密封,不需要构造函数的定义

时间: 2024-11-05 23:36:12

最常用的设计模式的相关文章

iOS开发中常用的设计模式

常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原则,开放-封闭原则实例:Notificatio

iOS常用的设计模式

iOS中常用的设计模式 ( 1 ) 代理模式 应用场景: 当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势: 敏捷原则: 开放 - 封闭原则 实例:tableView的 数据源delegate,通过和protocol的配合,完成委托诉求. 列表row个数delegate自定义的delegate ( 2 ) 观察者模式 应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息. 优势: 解耦合 敏捷原则: 接口隔离原则

最常用的设计模式(单例模式)

记得刚开始涉足程序的时候, 去笔试 ,发现有一个笔试题经常粗线,写一个单例模式的基本实现, 当时没研究设计模式也就不知为何物, 到今日  , 才发现它已成为我日常开发最常用的一种设计模式. 我写的所有设计模式的代码都会用java 呈现, 虽然第一个学习的是c++但是 最开始作为工作的是java,并且有点偏好java 单例模式 , 意思就是 整个系统仅只有此类的一个实力, 当然这只是狭义的单例,经常看到变种的单例是允许,创建指定数量的实例的 单例模式是一种创建型模式. 它是优化的一种策划, 避免重

几种常用的设计模式介绍

几种常用的设计模式介绍                                         1.    设计模式的起源 最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现. 在<建筑的永恒之道>里这样描述:模式是一条由三个部分组成的通用规则:它表示了一个特定环境.一类问题和一个解决方案之间的关系.每一个模式描述了一个不断重复发生的问题,

【动力节点java培训】J2ee常用的设计模式

[动力节点java培训]J2ee常用的设计模式 Java中的23种设计模式: Factory(工厂模式),      Builder(建造模式),      Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式), Adapter(适配器模式),    Bridge(桥梁模式),       Composite(合成模式), Decorator(装饰模式),    Flyweight(享元模式),   

iOS中常用的设计模式

常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原则,开放-封闭原则实例:Notificatio

OC中常用的设计模式

常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原则,开放-封闭原则实例:Notificatio

《.NET 设计规范》第 9 章:常用的设计模式

第 9 章:常用的设计模式 9.1 聚合组件 考虑为常用的特性域提供聚合组件. 要用聚合组件来对高层的概念(物理对象)进行建模,而不是对系统级的任务进行建模. 要让聚合组件的名字与众所周知的系统实体相对应,比如 MessageQueue.Process 或 EventLog,这样就能使类型更加引人注目. 要在设计聚合组件时使初始化尽可能地简单,这样用户只需进行简单的初始化就可以使用组件.如果某一项初始化是必需的,那么由于没有对组件进行初始化而引发的异常应该明确地告诉用户应该怎么做. 不要要求聚合

j2ee常用的设计模式

总共23种,分为三大类:创建型,结构型,行为型 我只记得其中常用的6.7种,分别是: 创建型(工厂.工厂方法.抽象工厂.单例) 结构型(包装.适配器,组合,代理) 行为(观察者,模版,策略) 然后再针对你熟悉的模式谈谈你的理解即可. Java中的23种设计模式: Factory(工厂模式),      Builder(建造模式),       Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式), A