工厂方法模式(Factory Method Pattern)又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。
工厂模式的分类
-
简单工厂模式
一个工厂类处于对产品类实例化的中心位置上,它知道每一个产品,决定哪一个产品类应该被实例化。
-
优点:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端,即在某种程度上支持"开闭"原则
-
缺点:对“开闭”原则支持不够,如果有新产品加入到系统中,需要修改工厂类。
总结:工厂实现产品的实例化,产品变化导致工厂类的变化。
-
-
工厂方法模式
核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。此核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪个产品类应当被实例化的细节。
- 优点:进一步抽象,允许系统在不修改具体工厂角色的情况下引进新的产品
- 缺点:只能针对一个产品等级结构
-
抽象工厂模式
具有一般性,需要面对多个产品等级结构
工厂模式具体实现
public interface FruitGardener {
public Fruit Factory();
}
public interface Fruit {
// 生长
public void grow();
// 收获
public void harvest();
// 栽种
public void plant();
}
public class AppleGardener implements FruitGardener{
@Override
public Fruit Factory() {
return new Apple();
}
}
public class GrapeGardener implements FruitGardener{
@Override
public Fruit Factory() {
return new Grape();
}
}
public class Apple implements Fruit{
private int treeAge;
public int getTreeAge() {
return treeAge;
}
public void setTreeAge(int treeAge) {
this.treeAge = treeAge;
}
@Override
public void grow() {
System.out.println("苹果正在生长...");
}
@Override
public void harvest() {
System.out.println("收割苹果...");
}
@Override
public void plant() {
System.out.println("栽种苹果...");
}
}
public class Grape implements Fruit{
private boolean isSeedless;
public boolean isSeedless() {
return isSeedless;
}
public void setSeedless(boolean seedless) {
isSeedless = seedless;
}
@Override
public void grow() {
System.out.println("葡萄正在生长...");
}
@Override
public void harvest() {
System.out.println("收割葡萄...");
}
@Override
public void plant() {
System.out.println("栽种葡萄...");
}
}
public class Test {
public static void main(String[] args) {
// 通过苹果园丁生产葡萄
AppleGardener appleGardener = new AppleGardener();
Fruit apple = appleGardener.Factory();
apple.plant();
apple.grow();
apple.harvest();
// 通过葡萄园丁生成苹果
GrapeGardener grapeGardener = new GrapeGardener();
Fruit grape = grapeGardener.Factory();
grape.plant();
grape.grow();
grape.harvest();
}
}