设计模式-简单工厂模式

一、场景简介

1、引入场景

订餐流程简单描述

  • 食品抽象类,规定食品的基础属性操作

  • 鱼类,鸡肉类食品类扩展

  • 订餐流程类,根据食品名称,加工指定类型食品

  • 模拟客户端预定操作

2、源代码实现

关系图谱

代码实现

java 复制代码
/**
 * 简单工厂模式引入场景
 */
public class C01_InScene {
    public static void main(String[] args) {
        OrderFood1 orderFood = new OrderFood1() ;
        orderFood.orderFood("fish") ;
        orderFood.orderFood("chicken") ;
    }
}
/**
 * 订餐流程
 */
class OrderFood1 {
    public Food1 orderFood (String foodName){
        Food1 food1 = null ;
        if (foodName.equals("fish")){
            food1 = new FishFood1() ;
            food1.setName("黑鱼");
        } else if (foodName.equals("chicken")){
            food1 = new ChickenFood1() ;
            food1.setName("土鸡");
        }
        if (food1 != null){
            food1.foodMaterial();
            food1.cookFood();
            return food1 ;
        } else {
            return null ;
        }
    }
}
/**
 * 食物抽象类
 */
abstract class Food1 {
    protected String name ;
    public abstract void foodMaterial () ;
    public void cookFood (){
        System.out.println("食品烹饪:" + name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
/**
 * 材料:黑鱼一条
 */
class FishFood1 extends Food1 {
    @Override
    public void foodMaterial() {
        System.out.println("材料:黑鱼一条");
    }
}
/**
 * 材料:土鸡一号
 */
class ChickenFood1 extends Food1 {
    @Override
    public void foodMaterial() {
        System.out.println("材料:土鸡一号");
    }
}

3、缺点分析

  • OCP原则:软件实体,如类、模块和函数,应当对扩展开放,但对修改关闭。

  • 违反设计模式的OCP原则,新增食品类不方便扩展,代码改动较大。

二、简单工厂模式

1、基本概念

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,是由一个工厂对象决定创建出哪个类的对象实例。

2、代码逻辑

关系图谱

代码实现

java 复制代码
/**
 * 简单工厂模式
 */
public class C02_SimpleFactory {
    public static void main(String[] args) {
        OrderFood2 orderFood2 = new OrderFood2() ;
        orderFood2.orderFood("chicken");
    }
}
class OrderFood2 {
    private SimpleFactory simpleFactory = new SimpleFactory() ;
    public void orderFood (String foodName){
        simpleFactory.orderFood(foodName) ;
    }
}
/**
 * 简单工厂类:封装食品的生产流程
 */
class SimpleFactory {
    public Food2 orderFood (String foodName){
        Food2 food2 = null ;
        if (foodName.equals("fish")){
            food2 = new FishFood2() ;
            food2.setName("黑鱼");
        } else if (foodName.equals("chicken")){
            food2 = new ChickenFood2() ;
            food2.setName("土鸡");
        }
        if (food2 != null){
            food2.foodMaterial();
            food2.cookFood();
            return food2 ;
        } else {
            return null ;
        }
    }
}
abstract class Food2 {
    protected String name ;
    public abstract void foodMaterial () ;
    public void cookFood (){
        System.out.println("食品烹饪:" + name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
class FishFood2 extends Food2 {
    @Override
    public void foodMaterial() {
        System.out.println("材料:黑鱼一条");
    }
}
class ChickenFood2 extends Food2 {
    @Override
    public void foodMaterial() {
        System.out.println("材料:土鸡一号");
    }
}

3、优缺点分析

优点总结

  • 该模式的核心是工厂类。这个类含有必要的逻辑判断;

  • 可以决定在什么时候创建哪一个登录验证类的实例;

  • 而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割;

  • 当系统引入新的登录方式的时候无需修改调用者;

缺点总结

这个工厂类集中了所有的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。

相关推荐
晨米酱20 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式