C#中的设计原则和创建型设计模式

七大设计原则:

1.SRP:单一职责,即设计类时,类的功能越少越好.

2.OCP:开放封闭原则,即对外扩展开放,对内修改封闭.

3.DIP:依赖倒置原则,即高端类尽量依赖于接口,而不依赖于低端类.

4.LSP:里氏替换原则,即子类代替父类.

5.LOD:迪米特法则,即类和类之间的关联关系越少越好.

6.ISP:接口隔离原则,即一个类对另外一个类的依赖性应当是建立在最小的接口上的.

7.CARP:合成聚合复用原则,即能使用组合方式编码,不采用继承.

二十三种设计模式可分为创建型(5+1),结构型(7)和行为型(11).

1.简单工厂根据用户参数实例化具体子类,以父类类型返回.环境要求所有子类继承于同一个父类.

2.工厂模式:把子类产品的实例化延迟到更小一级的子类工厂.

3.抽象工厂模式:解决一系列相关或相依赖的子类产品实例化问题.

4.单例模式:一个类只能被实例化一次.

5.原型:根据对象值创建副本.

6.建造者模式:把固定的结构和具体的表现形式剥离开,分装结构.

单例模式可以确保每个类仅有一个实例,并且提供一个全局访问点.

单例模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单

独的对象例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责.

示例代码:

public partial class frmAbout : Form

{

private frmAbout()

{

InitializeComponent();

}

private static frmAbout instance = null;

public static object obj = new object();

public static frmAbout GetInstance()

{

if (instance == null || instance.IsDisposed)

{

lock (obj)

{

if (instance == null || instance.IsDisposed)

{

instance = new frmAbout();

}

}

}

return instance;

}

工厂和抽象工厂的区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

具体一点:抽象工厂就像工厂,而工厂方法则像是工厂中一种产品生产线。

抽象工厂代码:

void Main()

{

AbstractFactory.ChooseFactory("1").GetProductA().Dump();

AbstractFactory.ChooseFactory("1").GetProductB().Dump();

AbstractFactory.ChooseFactory("2").GetProductA().Dump();

AbstractFactory.ChooseFactory("2").GetProductB().Dump();

}

// Define other methods and classes here

public interface IProductA{void ShowA();}

public interface IProductB{void ShowB();}

public class Product1A:IProductA

{

public void ShowA(){"Product1A".Dump();}

}

public class Product1B:IProductB

{

public void ShowB(){"Product1B".Dump();}

}

public class Product2A:IProductA

{

public void ShowA(){"Product2A".Dump();}

}

public class Product2B:IProductB

{

public void ShowB(){"Product2B".Dump();}

}

public abstract class AbstractFactory

{

public static AbstractFactory ChooseFactory(string name)

{

switch(name)

{

case "1":return new Factory1();

case "2":return new Factory2();

default:return null;

}

}

public abstract IProductA GetProductA();//因为不能确定产生哪个产品 所以返回接口

public abstract IProductB GetProductB();

}

public class Factory1:AbstractFactory

{

public override IProductA GetProductA(){return new Product1A();}

public override IProductB GetProductB(){return new Product1B();}

}

public class Factory2:AbstractFactory

{

public override IProductA GetProductA(){return new Product2A();}

public override IProductB GetProductB(){return new Product2B();}

}