工厂方法模式:在简单工厂模式的基础上,对工厂抽象,将原本创建产品的任务,放到工厂子类中执行。简单工厂模式添加产品,需要去修改对应的工厂类,而工厂方法模式添加产品,只需要添加对应的产品类和产品工厂类就可以了

    优点:
    相比简单工厂模式,封装了其中的变化,耦合度会更低。

    实现:
    还是以咖啡店为例,简单工厂模式:用户找到店员(工厂),告诉工厂我需要一杯什么咖啡,工厂给他制作一杯咖啡。现在店内将店员换成自动咖啡机(工厂抽象类),不同的咖啡机(工厂子类),生产不同的咖啡(产品),用户需要什么咖啡,只需要操作对应的咖啡机即可。

    1、咖啡类(产品)【与简单工厂一致】

    1. /**
    2. * 咖啡类(父类)
    3. */
    4. public abstract class Coffee {
    5. /**
    6. * 制作咖啡
    7. */
    8. public abstract void makeCoffee();
    9. }
    10. /**
    11. * 蓝山咖啡
    12. */
    13. public class CoffeeLanshan extends Coffee{
    14. public void makeCoffee(){
    15. System.out.println("制作了一杯蓝山咖啡");
    16. }
    17. }
    18. /**
    19. * 猫屎咖啡
    20. */
    21. public class CoffeeMaoShi extends Coffee{
    22. public void makeCoffee(){
    23. System.out.println("制作了一杯猫屎咖啡");
    24. }
    25. }

    2、工厂类(自动咖啡机)

    1. /**
    2. * 咖啡工厂类(父类)
    3. */
    4. public abstract class CoffeeFactory {
    5. /**
    6. * 获取一杯咖啡
    7. */
    8. public abstract Coffee getCoffee();
    9. }
    10. /**
    11. * 蓝山咖啡工厂类
    12. */
    13. public class CoffeeLanShanFactory extends CoffeeFactory{
    14. /**
    15. * 获取一杯咖啡
    16. */
    17. public Coffee getCoffee(){
    18. return new CoffeeLanshan();
    19. }
    20. }
    21. /**
    22. * 蓝山咖啡工厂类
    23. */
    24. public class CoffeeMaoShiFactory extends CoffeeFactory{
    25. /**
    26. * 获取一杯咖啡
    27. */
    28. public Coffee getCoffee(){
    29. return new CoffeeMaoShi();
    30. }
    31. }

    3、测试

    1. /**
    2. * 测试工厂方法模式
    3. */
    4. public class TestFactoryMethod {
    5. public static void main(String [] args){
    6. CoffeeFactory coffeeFactory1 = new CoffeeLanShanFactory();
    7. coffeeFactory1.getCoffee().makeCoffee();
    8. CoffeeFactory coffeeFactory2 = new CoffeeMaoShiFactory();
    9. coffeeFactory2.getCoffee().makeCoffee();
    10. }
    11. }

    测试结果:
    image.png

    工厂方法还可以通过反射来实现,灵活度更高。