设计模式详细系列教程 (二) 创建型模式
1.工厂方法模式(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类.
例如:雷锋帮助别人,雷锋并不指具体哪个人,可以是大学生、社区志愿者等等;我们可以写一个雷锋工厂接口IFactory(创建对象的接口),然后,让ColleageFactory类、VolunteerFactory类类来实现这个接口(子类)。如果需增加子类增加代码即可,克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
2.抽象工厂模式(Abstract Factory)
提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类.
例如:数据访问程序,我们对数据库操作时,可能会SQL server、DB2、Access等不同数据库操作,可能给不同表插入、获得的记录。
如果想在SQL server数据库中,在User表增加一条记录,我们可以写一个接口IFactory,再写一个SQLserverFactory类,对SQL server 数据库中表User增加记录;当你想对Access数据库中User表操作时,增加一个AccessFactory类,即可。另外为了解耦客户端直接操作数据库,需要把对数据库的操作提取出一个接口IUser。
3.建造者模式(Builder)
例如:建造小人,有胖人、瘦人、高的、矮的等等,在建造时难免会出错,少造个腿或胳膊等,利用建造这模式可解决这个问题。
Builder是一个抽象类,定义了一些基本建造方法(人的基本组成部分,如头、胳膊、腿、身体),具体的高、瘦等细节由子类来实现,用Director类使对象建造过程与外部(客户端)分离,减少耦合。
4.原型模式(Prototype)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
例如:简历复印,我们有一份原简历,需要复制多份或复制出和原简历差不多的简历,就可用原型模式写一个Prototype抽象类,里面定义一个抽象Clone()方法,然后,由ConcretePrototype具体实现。这里面经常涉及的浅复制和深复制问题,应该注意。
5.单例模式(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点.
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
单例模式可能会有安全问题,当多线程调用GetInstance()时,可以用lock语句是一段代码位于临界区,一个线程进入后,另一个线程就不能进入这段代码区,直到第一个线程释放该对象。