工厂方法模式:在简单工厂模式的基础上,对工厂抽象,将原本创建产品的任务,放到工厂子类中执行。简单工厂模式添加产品,需要去修改对应的工厂类,而工厂方法模式添加产品,只需要添加对应的产品类和产品工厂类就可以了
优点:
相比简单工厂模式,封装了其中的变化,耦合度会更低。
实现:
还是以咖啡店为例,简单工厂模式:用户找到店员(工厂),告诉工厂我需要一杯什么咖啡,工厂给他制作一杯咖啡。现在店内将店员换成自动咖啡机(工厂抽象类),不同的咖啡机(工厂子类),生产不同的咖啡(产品),用户需要什么咖啡,只需要操作对应的咖啡机即可。
1、咖啡类(产品)【与简单工厂一致】
/**
* 咖啡类(父类)
*/
public abstract class Coffee {
/**
* 制作咖啡
*/
public abstract void makeCoffee();
}
/**
* 蓝山咖啡
*/
public class CoffeeLanshan extends Coffee{
public void makeCoffee(){
System.out.println("制作了一杯蓝山咖啡");
}
}
/**
* 猫屎咖啡
*/
public class CoffeeMaoShi extends Coffee{
public void makeCoffee(){
System.out.println("制作了一杯猫屎咖啡");
}
}
2、工厂类(自动咖啡机)
/**
* 咖啡工厂类(父类)
*/
public abstract class CoffeeFactory {
/**
* 获取一杯咖啡
*/
public abstract Coffee getCoffee();
}
/**
* 蓝山咖啡工厂类
*/
public class CoffeeLanShanFactory extends CoffeeFactory{
/**
* 获取一杯咖啡
*/
public Coffee getCoffee(){
return new CoffeeLanshan();
}
}
/**
* 蓝山咖啡工厂类
*/
public class CoffeeMaoShiFactory extends CoffeeFactory{
/**
* 获取一杯咖啡
*/
public Coffee getCoffee(){
return new CoffeeMaoShi();
}
}
3、测试
/**
* 测试工厂方法模式
*/
public class TestFactoryMethod {
public static void main(String [] args){
CoffeeFactory coffeeFactory1 = new CoffeeLanShanFactory();
coffeeFactory1.getCoffee().makeCoffee();
CoffeeFactory coffeeFactory2 = new CoffeeMaoShiFactory();
coffeeFactory2.getCoffee().makeCoffee();
}
}
测试结果:
工厂方法还可以通过反射来实现,灵活度更高。