空对象模式,一般和工厂类结合使用有两种实现方式 一种通过接口,另一种是通过抽象类。反正不管哪一种 ,都要给你想要作用的那个类 , 定义一个接口,或者一个抽象类 一个方法 isNull(); 让类继承实现 这个方法 ,普通类就返回false ,空对象类 返回true
在上面工厂模式代码上进行修改。
首先,给Tree接口 加一个方法。 boolean isNUll()
package com.zfh.test.factory;
//抽象出 一个父类 即使 没有这个也没事 可以返回object 这个万类之父
public interface Tree {
//输出自己的品种
void sout();
//空对象模式 需要的
boolean isNUll();
}
Apple 和Banana类的 isNull() 返回false。
创建一个空对象类
public class NullTree implements Tree {
@Override
public void sout() {
System.out.println("我是空对象");
}
//返回true
@Override
public boolean isNUll() {
return true;
}
}
空对象类方法 isNull 返回的是true
改造工厂类
public class TreeFactory {
//用于标识 用枚举感觉更好
public static final int APPLE = 1;
public static final int BANANA = 2;
//这里 如果 返回的是 object 那么 就不需要 有tree接口了.因为 object 是基类
public static Tree getTree(int type) {
Tree tree = null;//必须 声明 并且初始化 否则 编译不了
switch (type) {
case APPLE:
tree = new AppleTree();
break;
case BANANA:
tree = new BananaTree();
break;
default://找不到的话 就返回空对象
tree = new NullTree();
break;
}
return tree;
}
}
工厂类注意default,如果传入的类型 找不到的话,就默认返回空对象类
使用
public class FactoryMain {
public static void main(String[] args) {
Tree apple = TreeFactory.getTree(TreeFactory.APPLE);
Tree banana = TreeFactory.getTree(TreeFactory.BANANA);
//这里随便传入一个数字 不是1 和2 就行
Tree nullApple = TreeFactory.getTree(5);
//判断是不是空对象类
if (!apple.isNUll()) {
apple.sout();
}
banana.sout();
System.out.println("空对象类的 isNull()方法 返回值 "+nullApple.isNUll());
//判断是不是空对象类
if (nullApple.isNUll()) {
nullApple.sout();
}
}
}
结果
总结
工厂类如果使用了空对象模式,那么返回值必定不为null。我们 可以通过对象isNull()方法来判断。相当于原来的null被空对象实例替代了