工厂方法模式(java)

目录

结构

案例

类图

 代码实现

抽象咖啡工厂

美式咖啡工厂

拿铁咖啡工厂

咖啡类(抽象产品类)

美式咖啡 

拿铁咖啡

咖啡店类

测试类

优缺点 

优点

缺点


结构

工厂方法模式的主要角色:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。

  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

案例

需求:设计一个咖啡店点餐系统。

类图

工厂方法模式(java)_第1张图片

 代码实现

抽象咖啡工厂

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡工厂
 * @date: 2023/7/18 16:27
 */
public interface CoffeeFactory {
    // 创建咖啡对象
    Coffee createCoffee();

}

美式咖啡工厂

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 美式咖啡工厂
 * @date: 2023/7/18 16:29
 */
public class AmericanCoffeeFactory implements CoffeeFactory {

    @Override
    public Coffee createCoffee() {
        return new AmericanCoffee();
    }

}

拿铁咖啡工厂

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 拿铁咖啡工厂
 * @date: 2023/7/18 16:31
 */
public class LatterCoffeeFactory implements CoffeeFactory{

    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
}

咖啡类(抽象产品类)

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡类
 * @date: 2023/7/18 14:43
 */
public abstract class Coffee {

    public abstract String getName();

    public  void addMilk(){System.out.println("加奶");}

    public void  addSuger(){
        System.out.println("加糖");
    }

}

美式咖啡 

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 美式咖啡
 * @date: 2023/7/18 14:47
 */
public class AmericanCoffee extends Coffee{

    public  String getName(){
        return "美式咖啡";
    }

}

拿铁咖啡

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 拿铁咖啡
 * @date: 2023/7/18 14:59
 */
public class LatteCoffee extends Coffee{

    public String getName(){
        return "拿铁咖啡";
    }
}

咖啡店类

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡店类
 * @date: 2023/7/18 16:33
 */
public class CoffeeStore {
    private CoffeeFactory factory;

    // 设置工厂
    public void setFactory(CoffeeFactory factory){
        this.factory = factory;
    }

    // 制作咖啡
    public Coffee orderCoffee(){
       Coffee coffee =   factory.createCoffee();

       // 加配料
       coffee.addMilk();
       coffee.addSuger();

       return coffee;
    }

}

测试类

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 测试类
 * @date: 2023/7/18 16:38
 */
public class Client {

    public static void main(String[] args) {

        // 创建美式咖啡工厂对象
        CoffeeFactory factory = new AmericanCoffeeFactory();
        // 创建咖啡店对象
        CoffeeStore store = new CoffeeStore();
        // 设置工厂
        store.setFactory(factory);

        // 点咖啡
        Coffee coffee  = store.orderCoffee();
        System.out.println(coffee.getName());

    }

}

优缺点 

优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程

  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则

缺点

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

你可能感兴趣的:(java设计模式,工厂方法模式,设计模式,java)