java设计模式之工厂模式
虽然学习java也有一段时间,但是初看<< thinking in java >>还是有些吃力,其中的原因是里面的章节有许多设计模式,初看这些设计模式还不能完全深刻领悟其中的道理,于是我决定先简单了解一下java中的一些设计模式.由于本文内容包含自己思考的代码,并不能保证能原汁原味反映设计模式的思想.
工厂模式
1.介绍:工厂是一个用来创建其它对象的对象,它会根据传来的参数不同而创建不同的对象.
2.先看我的一些类/接口的定义:
public interface Human {
void say();
}
public class Girl implements Human {
@Override
public void say() {
System.out.println("I am a girl");
}
}
public class Boy implements Human {
@Override
public void say() {
System.out.println("I am a boy");
}
}
3.示例A:我认为一种很蠢的方法(字符串参数)
public class HumanFactory {
public Human creat(String string){
if (string.toLowerCase().equals("girl")) return new Girl();
else if (string.toLowerCase().equals("boy")) return new Boy();
return null;
}
}
它是根据判断传来的参数来生成不同的Human对象,先不说如果有N多对象create方法会变得很长不优雅,要是你打代码的时候犯困参数经常写错…无语吧.
4.实例B:利用一个类型标记来创建对象,这个思想在<< thinking in java >>
中类型信息一章比较常见.
public Human creat(Class<? extends Human> c){
try {
return c.getConstructor().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
看上去简洁了一些,无论你的Human子类有多少个,你都不需要增加create的代码了,但是这必须保证你的Human子类必须有公共无参的构造函数.我想还是有一种没有毛病的的create方法的:
public interface Generator<T> {
T next();
}
public class GirlGenerator implements Generator<Girl> {
@Override
public Girl next() {
// 你的生成方法
}
}
public Human create(Generator<? extends Human> generator){
return generator.next();
}
这个时候你只需要定义自己的生成方法就可以了,虽然这中方法你每定义一个子类都需要实现Generator,但是可以将你的代码很好地分离,让你的create方法更加简单.