研读设计模式小结
1. 设计模式:
指在软件开发过程中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。
2. 简单工厂:
本质: 选择实现。
注意:简单工厂的重点在选择,实现是已经做好的。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端与实现之间解耦。
实现简单工厂的难点在于“如何选择”实现,有传递参数的方法,有动态参数的方法。
/**简单工厂 */ public class Factory {
public static Api create_GetApi(int type) {
Api api = null;
if (type == 1) {
api = new Api1();
} else if (type == 2) {
api = new Api2();
}
return api;
}
}
使用时:
Api api = Factory.create_GetApi( 1 );
3. 外观模式 Facade
本质:封装交互,简化调用。
外观模式封装了子系统外部和子系统内部多个模块的交互过程,从而简化了外部的调用。通过外观,子系统为外部提供一些高层的接口,方便使用。
客户端不需要去关心子系统内部模块的变动情况,只与这个外观类有依赖关系。
/*外观模式 Facade*/ public class FacadeApi { private FacadeAp i ( ) { } public static void test ( ) { AModuleApi a = new AModuleImpl(); a.testA(); BModuleApi b = new BModuleImpl(); b.testB(); CModuleApi c = new CModuleImpl(); c.testC(); } } /*外观模式 Facade*/ public interface FacadeApi{ //对外提供的组合方法 public void test(); //这些是ABC模块对子系统外的接口 public void a1(); public void b1(); public void c1(); }
4. 适配器模式
本质:转换匹配,利用功能
适配器通过转换现在的实现,从而能把已有的实现匹配成需要的接口。转换匹配是手段,利用已有的功能才是目的。
在实现的时候,适配器通常是一个类,一般会让适配器类去实现Target接口,然后在适配器的具体实现里面调用Adaptee。也就是说,适配器通常是一个Target类型,而不是Adaptee类型。
public class TwoDirectAdapter implements LogDBApi, LogFileApi { private LogDBApi dbLog; private LogFileApi fileLog; public TwoDirectAdapter( LogDBApi db , LogFileApi file) { this.dbLog = db; this.fileLog = file; } /*把文件操作的方式适配成DB实现方式;*/ public void createLog( LoginModule lm) { // 1. 读取文件内容; // 2. 加入新的日志对象; // 3. 重新写入文件; } }
5. 单例模式 Singleton
本质: 控制实例数目
单例模式是用来保证这个类在运行期间只会被创建一个类实例,另外,单例模式还提供了一个全局唯一访问这个类实例的访问点。
/* 懒汉式单例 */ public class Singleton { private static Singleton uniqueInstance = null; private Singleton() {} public static synchronized Singleton getInstance ( ) { if ( uniqueInstance == null ) { uniqueInstance = new Singleton(); } return uniqueInstance; } } /* 饿汉式单例 */ public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() {} public static Singleton getInstance ( ) { return uniqueInstance; } }
/* 最优的单例 */ public class Singleton { private static class SingletonHolder{ private static Singleton uniqueInstance = new Singleton(); } private Singleton() { } public static Singleton getInstance ( ) { return SingletonHolder.uniqueInstance; } }