回顾 简单工厂模式 ,它虽然实现了对象创建和使用的分离,但是每新增个产品就要修改工厂类 还是违背了OCP开闭原则 而工厂方法模式可以解决这个问题
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有以下四个角色
【案例】
假设有家咖啡店 它目前只卖美式咖啡和拿铁咖啡,但是随着业务的发展,它又加入了卡布奇诺和摩卡咖啡, 小张、小王、小李想喝不同的咖啡,请设计程序完成咖啡店的点餐功能(还是这个案例)
public abstract class Coffee{
abstract String getName();
void addSugar(){ System.out.println("加糖"); }
void addMilk(){ System.out.println("加奶"); }
}
美式咖啡
public class AmericanCoffee extends Coffee {
String getName(){
return "美式咖啡";
}
}
拿铁咖啡
public class LatteCoffee extends Coffee {
String getName(){
return "拿铁咖啡";
}
}
提供了创建产品的接口
public interface CoffeeFactory{
Coffee createCoffee();
}
美式咖啡工厂
public class AmericanCoffeeFactory implements CoffeeFactory{
public Coffee createCoffee(){
return new AmericanCoffee();
}
}
拿铁咖啡工厂
class LatteCoffeeFactory implements CoffeeFactory{
public Coffee createCoffee(){
return new LatteCoffee();
}
}
点餐
public class CoffeeStore {
public Coffee orderCoffee(CoffeeFactory factory){
Coffee coffee = factory.createCoffee();
coffee.addSugar();
coffee.addMilk();
System.out.println(coffee.getName()+"制作中...");
return coffee;
}
public static void main(String[] args) {
CoffeeStore store = new CoffeeStore();
CoffeeFactory factory = new AmericanCoffeeFactory(); //小张想喝美式咖啡
store.orderCoffee(factory);
CoffeeFactory factory1 = new LatteCoffeeFactory(); //小王想喝拿铁咖啡
store.orderCoffee(factory1);
}
}
现在想要加入马布奇诺或摩卡咖啡就无需修改工厂类,只需要在创建一个具体的产品类和一个具体的产品工厂就可以实现,满足了OCP开闭原则
//新添加的具体产品类
public class Cappuccino extends Coffee{
String getName(){return "卡布奇诺";}
}
//新添加的具体工厂类
public class CappuccinoFactory implements CoffeeFactory{
public Coffee createCoffee(){
return new Cappuccino();
}
}
这时小李想喝卡布奇诺就可以在主方法中new CappuccinoFactory
public static void main(String[] args) {
CoffeeStore store = new CoffeeStore();
CoffeeFactory factory1 = new LatteCoffeeFactory(); //小王想喝拿铁咖啡
store.orderCoffee(factory1);
CoffeeFactory factory2 = new CappuccinoFactory(); //小李想喝卡布奇诺
store.orderCoffee(factory2);
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_60117382/article/details/123558306
内容来源于网络,如有侵权,请联系作者删除!