文档章节

常用设计模式

木木情深
 木木情深
发布于 2013/10/22 22:29
字数 1707
阅读 39
收藏 0

 最常用的设计模式根据我的经验我把我经常用到的设计模式在这里做个总结,按照我的经验,它们的排序如下:1)单件模式、2)抽象工厂模式和工厂模式、3)适配器模式、4)装饰模式、5)观察者模式、6)外观模式 其他模式目前还很少用到。

单件模式

这是用的最多的模式,每一个正式的软件都要用它,全局配置、唯一资源、还有一个就是所有的工厂我都设计为单件模式,因此它的使用量大于工厂模式和抽象工厂模式之和。

 

是用来创建一个需要全局唯一实例的模式。只是需要纠正一点。singleton模式中,构造函数应该是protected.这样子类才可以扩展这个构造函数。
单件模式主要应用在以下场合:
对于一个类,占用的系统资源非常多。而且这些资源可以被全局共享,则可以设计为singleton模式,强迫全局只有一个实例
对于一个类,需要对实例进行计数。可以在createInstance中进行
并可以对实例的个数进行限制。
对于一个类,需要对其实例的具体行为进行控制,例如,期望返回的实例实际上是自己子类的实例。这样可以通过Singleton模式,对客户端代码保持透明。
用静态类可以代替单件吗

 

class Singleton

{

    private static Singleton singleton = null;

    private Singleton()   {}

    public static Singleton Instance

    {

       get{

        if (null == singleton)

            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.静态类:

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

本文转载自:http://blog.csdn.net/yunhaic/article/details/6740589

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
Java设计模式 create FactoryMethod

工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经...

神勇小白鼠
2011/05/18
0
0
JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian
05/22
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
08/27
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
JavaScript 中常见设计模式-代理模式

     代理模式   情景:小明追女生 A   非代理模式:小明 =花=> 女生A   代理模式:小明 =花=> 让女生A的好友B帮忙 =花=> 女生A   代理模式的特点   代理对象和本体对象具有一...

webstack前端栈
06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash各类扩展详解

Bash各类扩展详解 Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为B...

小陶小陶
今天
1
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
3
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部