工厂方法模式
- 一、概述
- 二、结构
- 三、实现
- 四、总结
- 在最后
一、概述
定义一个用户创建对象的工厂(接口),让接口的子类决定去实例化哪个对象,依赖其抽象编程。即工厂方法使一个类的实例化延迟到其工厂的子类。
二、结构
工厂方法模式的主要角色
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
- 具体工厂(ConcreFactory):主要实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性。
- 具体产品(ConcreteProduct):实现了抽象产品决定定义的结偶,由具体工厂来创建,它同具体工厂之间一一对应。
三、实现
工厂方法类图如下:
代码如下:
抽象工厂:
public interface CoffeeFactory {
public Coffee create();
}
抽象产品:
public abstract class Coffee {
public String name;
//加奶
public void addMilk(){
System.out.println("加奶");
}
//加糖
public void addSugar() {
System.out.println("加糖");
}
public abstract String getName();
public Coffee setName(String name) {
this.name = name;
return this;
}
}
具体的两个工厂:
public class LatteCoffeeFactory implements CoffeeFactory {
@Override
public Coffee create() {
return new LatteCoffee();
}
}
public class AmericanCoffeeFactory implements CoffeeFactory{
@Override
public Coffee create() {
return new AmericanCoffee();
}
}
具体的两个产品:
public class AmericanCoffee extends Coffee {
@Override
public String getName() {
return "美式咖啡";
}
}
public class LatteCoffee extends Coffee {
@Override
public String getName() {
return "拿铁咖啡";
}
}
创建对象:
public class CoffeeStore {
private CoffeeFactory factory;
public CoffeeStore setFactory(CoffeeFactory factory) {
this.factory = factory;
return this;
}
// 点咖啡的功能
public Coffee orderCoffee(){
Coffee coffee = factory.create();
//加配料
coffee.addMilk();
coffee.addSugar();
return coffee;
}
}
四、总结
优点:
- 前文中提到了,具体的产品和具体的工厂是一一对应的,所以用户只需知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创造过程。
- 如果以后要在系统中添加新的产品时,只需添加具体的产品类和对应的具体工厂类,无需对原工厂进行修改,满足开闭原则。
缺点:
- 每增加一个产品,就要增加一个具体的产品类和一个对应的具体工厂类,这增加了系统的复杂度。(如果系统中的产品类特别特别的多,就会缠上类爆照。。)
ps:
开闭原则:对修改关闭,对扩展开放。
在最后
❤️ 博主笔力尚浅,文中有疏漏之处还请流言指正,不胜感激。❤️ 谢谢大家。❤️