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();}
}

 

posted @ 2013-01-04 17:13  storys  阅读(199)  评论(0编辑  收藏  举报