《Design Pattern》 这个系列算是阅读《研磨设计模式》的读书笔记。
“面向接口编程”
接口中所有方法都是抽象方法,所有成员变量都是常量,只有方法定义而没有方法实现。
接口规定了实现类的外观
接口的思想,“封装隔离”,对方法调用和方法实现进行了隔离,方法实现的改变不会影响方法的调用,提高了灵活性,可扩展和维护性,“接口是系统可插拔的保证”
接口和抽象类的选择:优先使用接口。当既要定义子类行为,又要为子类提供公共的功能时,选择抽象类。
java程序习惯上分很多层(表现层,逻辑层,数据层),每层里又有很多模块,层与层之间,模块之间通过接口通信。
接口是被隔离部分的外观。
组件:能完成一定功能的封装体。小到一个类,大到一个系统,都可以成为组件。
从设计的角度看,系统,子系统,组件,模块说的是一回事,都是能完成一定功能的封装体,只是功能多少不同而已。
简单工厂:
定义:提供创建对象实例的功能,不关心具体实现(具体实现由其他类来完成),提供的对象实例类型可以是接口,抽象类,具体类。(即客户端不知道这个对象实例是如何被创建出来的,创建的方法被封装在了一个类或方法中)。
简单工厂体现了“面向接口编程”,client通过Factory获得接口类型的实例,Factory将这个实例是如何创建的封装了起来,client是不知道的,提高了灵活性。在java基础知识中,将具体类的实例对象赋值给接口类型变量,只是使用了接口多态的特性。
静态工厂:简单工厂中的方法都写成静态的,就是静态工厂了。为了避免不必要的简单工厂类实例,可以把其构造方法写成私有的。
可配置的简单工厂:1)客户端传参,缺点是向客户端暴漏部分信息,2)搞一个配置文件,简单工厂读取配置文件,运用反射创建对应实例。3)读取程序运行过程中的某个内存值
简单工厂的本质:选择实现。实现client和Impl之间的解耦。
运用场景:1)隔离封装具体实现 。2)要对创建的对象进行集中管理和控制
代码示例
public class Simple_Factory {
public static void main(String[] args) {
Api api1 = Factory.getApi(1);
Api api2 = Factory.getApi(2);
api1.work(); //ImplApi1 is working
api2.work(); //ImplApi2 is working
}
}
class Factory{
private Factory(){};
public static Api getApi(int type){ //带参数的静态工厂
Api api = null;
if(1 == type){
return new ImplApi1();
}else if(2 == type){
return new ImplApi2();
}
return api;
}
}
interface Api{
void work();
}
class ImplApi1 implements Api{
@Override
public void work() {
// TODO Auto-generated method stub
System.out.println("ImplApi1 is working");
}
}
class ImplApi2 implements Api{
@Override
public void work() {
// TODO Auto-generated method stub
System.out.println("ImplApi2 is working");
}
}