一、简单工程模式
简单工厂模式又叫做静态工厂方法模式
内容:由一个工厂对象决定创建出哪一种产品类的实例。
特点:一个工厂对象只生产一个所对应的实例。
优点:使用非常简单
缺点:扩展比较困难,不符合开闭原则
例如下面的例子:女娲通过八卦炉生产出各式各样的人类,这个过程考虑用简单工厂模式实现。类图如下:
public class HumanFactory {
public static <T extends Human> T createHuman(Class<T> c) {
//定义一个生产出的人种
Human human = null;
try {
//产生一个人种
human = (Human)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
System.out.println("人种生成错误!");
}
return (T)human;
}

}
产生一个产品对象的方法,非常简单,直接调用简单工厂中的对应方法即可。
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
二、工厂方法模式
工厂方法模式弥补了简单工厂模式的不足,它符合开闭原则。
内容:创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
特点:将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
优点:
- 良好的封装性,代码结构清晰
调用者需要创建一个产品对象,只需要知道产品的类名就可以了。并且调用者不用关心产品类如何变化,只需要关心产品的接口,只要接口不变,系统的上层模块就不会发生变化。
- 扩展性非常优秀
只需要适当修改具体的工厂类或扩展一个工厂类,就可以增加产品了。
注意:工厂方法符合开闭原则、迪米特法则、依赖倒转原则、里式替换原则
还是上面的例子,考虑用工厂方法模式实现。类图如下:
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> c);

}

public class HumanFactory extends AbstractHumanFactory {
public <T extends Human> T createHuman(Class<T> c) {
//定义一个生产的人种
Human human=null;
try {
//产生一个人种
human = (T)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
System.out.println("人种生成错误!");
}
return (T)human;
}

}
当需要生产一个产品对象时,只需要首先创建出对应的工厂,然后通过工厂再生产产品即可。
AbstractHumanFactory factory = new HumanFactory();
Human whiteHuman = factory.createHuman(WhiteHuman.class);
三、抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本。
内容:创建产品对象的工厂接口,无需指定所创建产品的具体类。
特点:无需指定所创建产品的具体实现类。
优点:
- 良好的封装性
高层模块不需要关心每个产品的具体实现类,只需要知道工厂类是谁,就能创建一个需要的对象。
- 产品族内的约束为非公开的状态
具体的产品族内的约束是在工厂内实现的。
缺点:
扩展非常困难,不符合开闭原则。
还是之前的例子,这次稍微扩展一下,增加一个性别属性,考虑使用抽象工厂模式实现。类图如下:
public abstract class AbstractWhiteHuman implements Human {
//白色人种的皮肤颜色是白色的
public void getColor() {
System.out.println("白色人种的皮肤颜色是白色的!");
}
//白色人种讲话
public void talk() {
System.out.println("白色人种会说话,一般说的都是单字节。");
}
}
AbstractBlackHuman、AbstractYellowHuman略
public class MaleWhiteHuman extends AbstractWhiteHuman {
//白人男性
public void getSex() {
System.out.println("白人男性");
}

}
FemaleBlackHuman、MaleBlackHuman、FemaleYellowHuman、MaleYellowHuman略
public interface HumanFactory {
//制造一个黄色人种
public Human createYellowHuman();
//制造一个白色人种
public Human createWhiteHuman();
//制造一个黑色人种
public Human createBlackHuman();

}

public class MaleFactory implements HumanFactory {
//生产出黑人男性
public Human createBlackHuman() {
return new MaleBlackHuman();
}
//生产出白人男性
public Human createWhiteHuman() {
return new MaleWhiteHuman();
}
//生产出黄人男性
public Human createYellowHuman() {
return new MaleYellowHuman();
}
}
FeMaleFactory略
最终我们以生产一个白人男性为例。生产过程如下:
HumanFactory maleHumanFactory = new MaleFactory();
Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();