目录
结构
案例
类图
代码实现
简单咖啡工厂类
咖啡店类
咖啡类
具体咖啡类
简单工厂方法的优缺点
优点
缺点
结构
简单工厂包含如下角色:
抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。
具体产品 :实现或者继承抽象产品的子类
具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。
案例
需求:设计一个咖啡店点餐系统。
设计一个咖啡类(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 "拿铁咖啡";}
}
简单工厂方法的优缺点
优点
封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
缺点
增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。