一、引言:
新人学java的时候,工厂模式和代理模式是必须掌握的两种设计模式,工厂模式的方针图如下:
假设我们的产品是一个抽象接口,而我们的具体产品继承自该接口,为了实现工厂模式,我们同样声明了一个工厂接口Creator,里面就是我们需要实现的工厂方法,当我们需要产出一个具体的产品时,自然我们需要实例化一个具体的工厂类,该类就继承自抽象工厂接口,这样,上层产品不需要去关注类的具体实现,只需要关注工厂抽象类本身就可以了。
二、工厂实例:
interface Human {
/* 获取人种肤色 */
public void getColor();
/* 测试接口 */
public void talk();
}
class BlackHuman implements Human {
public void getColor(){
System.out.println("黑色人种的皮肤颜色是黑色的!");
}
public void talk() {
System.out.println("黑人会说话,一般人听不懂。");
}
}
class YellowHuman implements Human {
public void getColor(){
System.out.println("黄色人种的皮肤颜色是黄色的!");
}
public void talk() {
System.out.println("黄色人种会说话,一般说的都是双字节。");
}
}
class WhiteHuman implements Human {
public void getColor(){
System.out.println("白色人种的皮肤颜色是白色的!");
}
public void talk() {
System.out.println("白色人种会说话,一般都是但是单字节。");
}
}
/* 将工厂类的createHuman设置为静态方法,省去工厂类的实例化 */
class HumanFactory {
public static <T extends Human> T createHuman(Class<T> c){
T human = null;
try {
/* 产生一个人类 */
human = c.newInstance();
} catch (Exception e) {
System.out.println("人种生成错误!");
}
return human;
}
}
public class static_factory {
public static void main(String[] args) {
/* 造一个白种人 */
System.out.println("--造出的第一个人是白色人种--");
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();
/* 造一个黑种人 */
System.out.println("\n--造出的第二个人是黑色人种--");
Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
/* 造一个黄种人 */
System.out.println("\n--造出的第三个人是黄色人种--");
Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
}
}
该例的UML图如下:
我们的Human对应的就是方针图中的Product,BlackHuman、YellowHuman和WhiteHuman是三种不同的具体产品,AbstractHumanFactory是方针图中的Creator,也就是我们的抽象工厂,HumanFactory就是我们的具体工厂,其目的就是去产生各种肤色的人(产品)。
上面的demo中,我们实现的是一个具体工厂可以制造各种肤色的人,更规范的设计是每种肤色对应一个具体的工厂,不过这样做的话会增加代码的可维护性,但大型项目中提倡这种做法。
博客参考书籍:秦小波 《设计模式之禅(第2版)》