简单工厂模式(java)

目录

结构

案例

类图

代码实现

简单咖啡工厂类

 咖啡店类

 咖啡类

具体咖啡类

测试类

简单工厂方法的优缺点

优点

缺点


结构

简单工厂包含如下角色:

抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。
具体产品 :实现或者继承抽象产品的子类
具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。

案例

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

设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。

类图

代码实现

简单咖啡工厂类

package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 简单咖啡工厂
 * @date: 2023/7/18 14:40
 */
public class SimpleCoffeeFactory {

    public  Coffee cratateCoffee(String type){

          Coffee coffee = null;
          if("美式咖啡".equals(type)){
              coffee = new AmericanCoffee();
          }
          else if("拿铁咖啡".equals(type)) {
              coffee = new LatteCoffee();
          }
          else {
              System.out.println("对不起,你点的咖啡不存在");
              return null;
          }
            return coffee;
    }

}

 咖啡店类

package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡店类
 * @date: 2023/7/18 14:52
 */
public class CoffeeStore {

    public Coffee orderCoffee(String type, String add){

        // 创建咖啡工厂
        SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
        // 制作咖啡
         Coffee coffee =  factory.cratateCoffee(type);

        if ("加糖" .equals(add) )  coffee.addMilk(); // 加奶
        else if("加奶" .equals(add))  coffee.addSuger(); // 加糖
        else System.out.println("无需加配料");

        return coffee;
    }

}

 咖啡类

package coffee_produce;

/**
 * @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 coffee_produce;

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

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

}
package coffee_produce;

/**
 * @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: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());

    }

}

简单工厂方法的优缺点

优点

封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

缺点

增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。

猜你喜欢

转载自blog.csdn.net/qq_51179608/article/details/131789310
今日推荐