工厂方法模式:在简单工厂模式的基础上,对工厂抽象,将原本创建产品的任务,放到工厂子类中执行。简单工厂模式添加产品,需要去修改对应的工厂类,而工厂方法模式添加产品,只需要添加对应的产品类和产品工厂类就可以了
优点:
相比简单工厂模式,封装了其中的变化,耦合度会更低。
实现:
还是以咖啡店为例,简单工厂模式:用户找到店员(工厂),告诉工厂我需要一杯什么咖啡,工厂给他制作一杯咖啡。现在店内将店员换成自动咖啡机(工厂抽象类),不同的咖啡机(工厂子类),生产不同的咖啡(产品),用户需要什么咖啡,只需要操作对应的咖啡机即可。
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();}}
测试结果:
工厂方法还可以通过反射来实现,灵活度更高。
