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