设计模式主要分为三种类型:创建型、结构性和行为型。 1.创建型模式
对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题:其中简单工厂模式不是GoF总结出来的23种设计模式之一。 单例模式(Singleton); 简单工厂模式(Simple Factory); 工厂方法模式(Factory Method); 抽象工厂模式(Abstract Factory); 创建者模式(Builder); 原型模式(Prototype); 2.结构型模式
如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等:外观模式(Facade); 适配器模式(Adapter); 代理模式(Proxy); 装饰模式(Decorator); 桥模式(Bridge); 组合模式(Composite); 享元模式(Flyweight)。 3.行为型模式
如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高:模板方法模式(Template Method); 观察者模式(Observer); 状态模式(State); 策略模式(Strategy); 职责链模式(Chain of Responsibility); 命令模式(Command); 访问者模式(Visitor); 调停者模式(Mediator); 备忘录模式(Memento); 迭代器模式(Iterator); 解释器模式(Interpreter)。 一、单例模式
保证一个类只有一个实例: (1)定义一个静态变量来保存类的实例 private static Study instance; (2)定义私有构造函数,使外界不能创建该类的实例 private Study { } (3)提供提供一个访问它的全局访问点 public static Study GetInstance() { if(instance == null) { instance =new Study(); } return instance; } 多线程只需再定义一个标识确保线程同步 private static readonly object locker =new object(); 在(3)中进行加锁操作 public static Study GetInstance() { //第一个线程运行到这里会对locker对象进行"加锁" //第二个线程运行到这里检测到locker为"加锁"状态 //就会挂起等待第一个线程解锁 //线程运行完就会对locker进行解锁 if(instance == null) { lock(locker) { if(instance == null) { instance =new Study(); } } } return instance; }二、简单工厂
定义一个工厂类,根据需要加工产品来决定建立各种类的实例 如建立一个学习计划工厂类,先建立各种学习的类如:java、c、c# 、c++ 等,然后再根据学生的选择具体建立各种类的实例。 public abstract class StudyPlan { public abstract void Learn(); } public class StudyJava:StudyPlan { public override void Learn() { //学习Java目标 } } public class StudyC:StudyPlan { public override void Learn() { //学习C目标 } } public class StudyFactory { public StudyPlan MakePlan(string type) { StudyPlan studyPlan =null; if(type =="java") { studyPlan = new StudyJava(); } else if(type =="c") { studyPlan = new StudyC(); } else if(...) { //.... } return studyPlan; } } void main() { //创建学习工厂、制定学习java的学习计划、开始学习 StudyFactory s1 =new StudyFactory(); StudyPlan plan =s1.MakePlan("Java"); plan.Learn(); //制定学习c的计划、开始学习 StudyPlan plan2 =s1.MakePlan("C"); plan2.Learn(); } 简单工厂,在工厂类中一次性将所有具体产品全部实现,通过用户选择进行该产品的实例化。三、工厂方法
把具体产品(学习计划)的实现推迟到子类中 分别建立c、c++、c#、java等学习工厂,每个工厂实现具体的学习计划。 public abstract class StudyPlan { public abstract void Learn(); } public class StudyC:StudyPlan { public override void Learn() { //学习C目标 } } public abstract class StudyFactory { public abstract StudyPlan MakeStudyPlan(); } puvlic class StudyCFactory:StudyFactory { public override StudyPlan MakeStudyPlan() { StudyPlan plan = new StudyC(); return plan; } } void Main() { //创建c 学习工厂、制定C学习计划、开始学习 StudyCFactory s1 = new StudyCFactory(); StudyPlan cPlan=s1.MakeStudyPlan(); cPlan.Learn(); //java类同c类,已省略 //创建java学习工厂、制定java学习计划、开始学习 StudyCFactory s2 = new StudyJavaFactory(); StudyPlan javaPlan=s2.MakeStudyPlan(); javaPlan.Learn(); }四、抽象方法
像c、java的学习也包括新手入门、中级进阶等。这里就要制定不同的学习计划。 C工厂制定 C的新手入门、中级进阶计划,java工厂就要制作Java的新手入门、中级进阶计划。 public abstract class StudyFactory { public abstract StudyPlan MakeEasyPlan(); public abstract StudyPlan MakeMiddlePlan(); } public class StudyCFactory :StudyFactory { public override StudyPlan MakeEasyPlan() { StudyPlan p1=new CEasyStudyplan(); return p1; } public override StudyPlan MakeMiddlePlan() { StudyPlan p2=new CMiddleStudyplan(); return p2; } } public abstract class StudyPlan { public abstract void Learn(); } public class CEasyStudyplan :StudyPlan { public override void Learn() { //学习简单C } } public class CMiddleStudyplan:StudyPlan { public override void Learn() { //学习中级C } } void main() { StudyCFactory CStudy =new StudyCFactory(); StudyPlan easyCPlan=CStudy.MakeEasyPlan(); easyCPlan.learn(); StudyPlan middleCPlan = CStudy.MakeMiddlePlan(); middleCPlan.Learn(); //java 的同理 这里就省略了。。。。 }