几个工厂模式的差异
创建型设计模式都多个,其中几个很容易搞混,Factory Method(工厂模式),Abstract Factory(抽象工厂模式)和Builder(建造者模式),但实际上这3个使用场景是不同的。工厂模式应用的最多,都是一些简单的对象构件场景;抽象工厂应用于复杂的构建场景,而且工厂和产品都需要实现扩展;建造者关键场景是需要进行很多组件的装配,实际场景下,可能会和抽象工厂模式一起混合使用。应用这几个模式的原则是,如果能够使用工厂模式完成,就不要使用后面两种,否则就是杀鸡用了牛刀。
Singleton(单例模式):运行环境中只建立一个,可以方便的进行全局访问,为了避免多线程问题,最好对象里面存放的都是只读数据,这样在程序一开始,只有主线程运行的时候就完成初始化,避免初始化过程中线程竞争问题。单例模式实现的方式有很多种,可以网上查询一下具体的实现方式,对比它们的优缺点,最好的单例模式实现不应该使用锁,锁会降低并发性能。应用场景全局:安卓的Application(单例对象),在该类的onCreate()方法可以初始化自己的全局缓存对象(单例对象),Activity之间通过全局缓存传递复杂数据,intent的只传递key值,这样可以减少数据的序列化和反序列化带来的性能消耗。
Prototype(原型模式):使用对象克隆一个新的对象,使用场景:单据的备份保存,原单和备份单有相同的数据结构,使用原单对象克隆一个备份单对象,具体的实现就是BEAN对象的拷贝和赋值,可以通过JAVA的反射原理在单据的基类当中实现,这样可以大大减少代码的开发量。
Factory Method(工厂模式):细分为两种,一个是简单工厂;一个是使用抽象方法,让子类决定生产什么对象。简单工厂运用场景:数据库Facade的建立,网络层Facade的建立,如下图,使用DataSourceFactory创建IDataSourceManager,通过传入的连接参数决定创建本地实现还是远程实现。
第二种方式适合创建更加复杂的场景,例如:单据GUI基类创建对应的单据实体类,因为基类是不知道创建什么单据实体类的,创建决定权交给了下面的GUI的子类。下面的图片案例里面,子类需要在构造函数里面设置单据对象m_orderClass来告知父类创建什么单据。
Abstract Factory(抽象工厂模式):抽象工厂用来处理比工厂模式更加复杂的对象构件场景,可以实现产品和工厂的独立演化,类图结构上有些类似桥接模式,当然应用的目的和场景都不同,下面是抽象工厂的类图结构:
应用抽象工厂模式的关键是抽象工厂类和抽象产品类的设计,设计过程考验着设计者的抽象归纳思维能力,比如这个UML工具的图形对象的抽象设计,每个图形对象都需要知道怎么绘制自己,抽象出函数paint(),都应该知道怎么计算自己尺寸,抽象出computeSize(),这个抽象过程也是一个不断完善的过程。
Builder(建造者模式):建造者模式也是应用于复杂的创建场景,和抽象工厂的区别就是,建造者模式有个Director来负责各个零件的装配,例如,在UML工具的例子当中,图形面板的创建就可以使用建造者,建造者的director负责把多个图形在面板上根据位置装配起来,形成一个整体的图形面板。