工厂方法模式(Factory Method Pattern)又称为工厂模式,是一种创建型设计模式。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。
工厂方法模式结构图
工厂方法模式包含如下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();
}
输出结果
美式咖啡
给美式咖啡加奶!
给美式咖啡加糖!
拿铁
给拿铁加奶!
给拿铁加糖!
留言与评论(共有 0 条评论) “” |