定义一个用于创建的对象的接口,让子类觉得实例化哪个产品类对象。工厂方法使一个产品的实例化延迟到其工厂的子类。
- 抽象工厂
- 具体工厂
- 抽象产品
- 具体产品
抽象工厂
public interface CoffeeFactory{
Coffee createCoffee();
}
具体工厂(美式工厂)
public class AmericanCoffeeFactory{
@Override
public Coffee createCoffee(){
return new AmericanCoffee();
}
}
具体工厂(拿铁工厂)
public class LatteCoffeeFactory{
@Override
public Coffee createCoffee(){
return new LatteCoffee();
}
}
抽象产品
public abstract class Coffee{
public abstract String getName();
public void addMilk(){
System.out.println("加奶");
}
public void addSugar(){
System.out.println("加糖");
}
}
具体产品(美式咖啡)
public class AmericanCoffee extends Coffee{
@Override
public String getName(){
return "美式";
}
}
具体产品(拿铁咖啡)
public class LatteCoffee extends Coffee{
@Override
public String getName(){
return "拿铁";
}
}
客户调用(咖啡店)
public class CoffeeStore{
private CoffeeFactory mFactory;
public CoffeeStore(CoffeeFactory factory){
this.mFactory = factory;
}
public Coffee orderCoffee(){
Coffee coffee = mFactory.createCoffee();
coffee.addMilk();
coffee.addSugar();
return coffee;
}
}
优点:
用户只需要知道具体工厂的名称就可以得到所要的产品,无须知道产品的具体创建过程。
在系统添加新的产品时只需添加对应的产品类和对应的具体工厂类,无须对原工厂进行任何修改,符合开闭原则。
缺点:每增加一个产品就要增加一个具体产品类和一个对应具体工厂类,这增加了系统复杂度。