一、工厂方法模式概述

工厂方法模式(Factory Method Pattern)又称为工厂模式,是一种创建型设计模式。

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。

二、工厂方法模式结构图

设计模式详解教程(设计模式工厂方法模式)(1)

工厂方法模式结构图

工厂方法模式包含如下4种角色:

(1)Factory:抽象工厂,是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

(2)ConcreteFactory:具体工厂,这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

(3)Product:抽象产品,工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

(4)ConcreteProduct:具体产品,这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。。

三、工厂方法模式的适用场景

工厂方法模式主要适用于以下应用场景:

(1)创建对象需要使用大量的重复代码;

(2)客户端不依赖产品类实例如何被创建、如何实现等细节;

(3)一个类通过其子类来指定创建哪个对象。

四、工厂方法模式的优缺点

优点

(1)灵活性增强,对于新产品的创建,只需要多写一个相应的工厂类。

(2)典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

五、代码实现

Coffee.java —— 抽象产品

/** * @description 咖啡父类(抽象产品类) */ public interface Coffee { /** 获取名称 */ String getName(); /** 加奶 */ void addMilk(); /** 加糖 */ void addSugar(); }

LatteCoffee.java —— 拿铁(具体产品)

/** * @description 拿铁(具体产品类) */ public class LatteCoffee implements Coffee { @Override public String getName() { return "拿铁"; } @Override public void addMilk() { System.out.println("给拿铁加奶!"); } @Override public void addSugar() { System.out.println("给拿铁加糖!"); } }

AmericanCoffee.java —— 美式咖啡(具体产品)

/** * @description 美式咖啡(具体产品类) */ public class AmericanCoffee implements Coffee { @Override public String getName() { return "美式咖啡"; } @Override public void addMilk() { System.out.println("给美式咖啡加奶!"); } @Override public void addSugar() { System.out.println("给美式咖啡加糖!"); } }

CoffeeFactory.java —— 咖啡工厂类(抽象工厂)

/** * @description 咖啡工厂类(抽象工厂类) */ public interface CoffeeFactory { /** 创建咖啡 */ Coffee create(); }

LatteCoffeeFactory.java —— 拿铁咖啡工厂类(具体工厂)

/** * @description 拿铁咖啡工厂类(具体工厂类) */ public class LatteCoffeeFactory implements CoffeeFactory{ @Override public Coffee create() { return new LatteCoffee(); } }

AmericanCoffeeFactory.java —— 美式咖啡工厂类(具体工厂)

/** * @description 美式咖啡工厂类(具体工厂类) */ public class AmericanCoffeeFactory implements CoffeeFactory { @Override public Coffee create() { return new AmericanCoffee(); } }

测试

public static void main(String[] args) { CoffeeFactory coffeeFactory = new AmericanCoffeeFactory(); Coffee coffee = coffeeFactory.create(); System.out.println(coffee.getName()); coffee.addMilk(); coffee.addSugar(); coffeeFactory = new LatteCoffeeFactory(); coffee = coffeeFactory.create(); System.out.println(coffee.getName()); coffee.addMilk(); coffee.addSugar(); }

输出结果

美式咖啡 给美式咖啡加奶! 给美式咖啡加糖! 拿铁 给拿铁加奶! 给拿铁加糖!

,