设计模式复习、实践和总结(一)

来源:互联网 发布:足球角球比分数据 编辑:程序博客网 时间:2024/06/06 18:15
最近投简历的时候发现有些公司要求会设计模式,当看到设计模式的时候,瞬间懵逼了,什么是设计模式?当上网看了下设计模式的介绍时。。。发现自己竟然学过设计模式。。。偶尔也用过设计模式,现在重新复习和总结一下设计模式,以留备用。。。。。[这里只是自己的理解和实践,具体的可以参考](http://www.cnblogs.com/zhili/category/496417.html)

设计模式主要分为三种类型:创建型、结构性和行为型。
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 的同理 这里就省略了。。。。}
原创粉丝点击