设计模式(2)――创建型模式 (一)

2014-11-24 02:43:08 · 作者: · 浏览: 13

对设计模式学了有一段的时间了,设计模式是软件工程的基石,他是人们反复使用的,程序员们几十年的经验总结,以“开放—封闭”、“单一职责”、“依赖倒转”、“里氏代换”、“合成聚合复用”、“迪米特法则”、“接口隔离”为基本原则。


本篇博客我对创建型模式进行总结,其中包括:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。


1. 单例模式

这是最简单的一个模式,保证一个类仅有一个实例,并提供一个访问他的全局访问点。可以严格的控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。它的秘密武器是创建私有的构造函数。(就像中国只能有一个,任何人不可分割)

UML图:

\

代码:

view plaincopy to clipboardprint namespace 单例模式
{
class Class1
{
static void Main(string[] args)
{
Singleto s1 = Singleto.GetInstance();
Singleto s2 = Singleto.GetInstance();
//Singleto s3 = new Singleto();
if (s1 == s2)
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();
}
}
class Singleto
{
private static Singleto instance;

private Singleto() //让构造方法私有,不能使用new实例化
{ }

public static Singleto GetInstance()
{
if (instance == null)
{
instance = new Singleto();
}
return instance;
}
}
}
namespace 单例模式
{
class Class1
{
static void Main(string[] args)
{
Singleto s1 = Singleto.GetInstance();
Singleto s2 = Singleto.GetInstance();
//Singleto s3 = new Singleto();
if (s1 == s2)
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();
}
}
class Singleto
{
private static Singleto instance;

private Singleto() //让构造方法私有,不能使用new实例化
{ }

public static Singleto GetInstance()
{
if (instance == null)
{
instance = new Singleto();
}
return instance;
}
}
}

2 . 工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。(就像服装生产工厂,有专门生产袜子的工厂,有专门生产内衣的工厂)

UML图:

\

代码:

view plaincopy to clipboardprint namespace 工厂模式
{
class Class1
{
static void Main(string[] args)
{
IFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine(result );
}
}
interface IFactory //工厂接口
{
Operation CreateOperation();
}
class AddFactory : IFactory //加法工厂
{

public Operation CreateOperation()
{
return new OperationAdd();
}
}
class SubFactory : IFactory //减法工厂
{

public Operation CreateOperation()
{
return new OperationSub();
}
}
class MulFactory : IFactory //乘法工厂
{

public Operation CreateOperation()
{
return new OperationMul();
}
}
class DivFactory : IFactory //除法工厂
{

public Operation CreateOperation()
{
return new OperationDiv();
}
}

public class Operation //抽象运算类
{
private double _numberA = 0;
private double _numberB;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB