设计模式之简单工厂模式

简单工厂模式概念

简单工厂模式(Simple Factory Pattern)是一种常用的创建型设计模式,它提供了一个创建对象的静态方法,而不必将客户端代码与对象创建代码耦合在一起。简单工厂的核心在于存在一个拥有创建多种产品能力的工厂类,客户端只需要知道所需产品的名称或类型即可通过工厂获取到相应的产品实例。

举个栗子

学生小久要去食堂吃饭

小久看看食物有 (小鸡炖蘑菇) ( 番茄炒鸡蛋) (青椒肉丝) (红烧肉)

小久问食堂打饭阿姨要了份红烧肉,食堂打饭阿姨给小久打了一份红烧肉,小久吃饭

小久==》红烧肉===》食堂打饭阿姨===》盛一份红烧肉 ===》给小久 ===》小久吃饭

小久通过食堂打饭阿姨获取红烧肉,小久不参与盛饭的过程

简单工厂模式个人理解

对象使用者通过工厂获取对象实例,对象使用者不参与对象的创建

使用java代码实现

1)准备食物接口

Food接口代码

java 复制代码
package org.xiji.easyFactory.food;

/**
 * 食物
 */
public interface Food {
    /**
     * 食物
     * @return
     */
    String getFood();
}

2)实现食物实现类

1.红烧肉实现类代码

java 复制代码
package org.xiji.easyFactory.food.impl;

import org.xiji.easyFactory.food.Food;

/**
 * 红烧肉
 */
public class BraisedPork implements Food {
    @Override
    public String getFood() {
        return "红烧肉";
    }
}

2.小鸡炖蘑菇实现类代码

java 复制代码
package org.xiji.easyFactory.food.impl;

import org.xiji.easyFactory.food.Food;

/**
 * 小鸡炖蘑菇
 */
public class ChickenStewWithMushrooms implements Food {
    @Override
    public String getFood() {
        return "小鸡炖蘑菇";
    }
}

3.青椒肉食实现类代码

java 复制代码
package org.xiji.easyFactory.food.impl;

import org.xiji.easyFactory.food.Food;

/**
 * 青椒肉丝
 */
public class PepperSteak implements Food {
    @Override
    public String getFood() {
        return "青椒肉丝";
    }
}

4.番茄炒鸡蛋实现类代码

java 复制代码
package org.xiji.easyFactory.food.impl;

import org.xiji.easyFactory.food.Food;

/**
 * 番茄炒鸡蛋
 */
public class ScrambledEggsWithTomatoes  implements Food {
    @Override
    public String getFood() {
        return "番茄炒鸡蛋";
    }
}

3)创建食堂打饭阿姨的实现类

java 复制代码
package org.xiji.easyFactory;

import org.xiji.easyFactory.food.Food;
import org.xiji.easyFactory.food.impl.BraisedPork;
import org.xiji.easyFactory.food.impl.ChickenStewWithMushrooms;
import org.xiji.easyFactory.food.impl.PepperSteak;
import org.xiji.easyFactory.food.impl.ScrambledEggsWithTomatoes;

/**
 * 食堂阿姨
 */
public class FoodMangerFactor {

    public static Food getFood(String foodName)
    {
        if(foodName.equals("小鸡炖蘑菇"))
        {
            return new ChickenStewWithMushrooms();
        }
        else if(foodName.equals("番茄炒鸡蛋"))
        {
            return new ScrambledEggsWithTomatoes();
        }
        else if(foodName.equals("青椒肉丝"))
        {
            return new PepperSteak();
        }
        else if(foodName.equals("红烧肉"))
        {
            return new BraisedPork();
        }

        return null;
    }
}

4)创建学生类

java 复制代码
package org.xiji.easyFactory;

import org.xiji.easyFactory.food.Food;

/**
 * 学生
 */
public class Student {
    private Food food;
    private String name;

    public Student() {
    }

    public void eat()
    {
        System.out.println(name+"正在吃:" + food.getFood());
    }

    public Food getFood() {
        return food;
    }

    public void setFood(Food food) {
        this.food = food;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5)在main中实现

java 复制代码
package org.xiji;

import org.xiji.easyFactory.FoodMangerFactor;
import org.xiji.easyFactory.Student;
import org.xiji.easyFactory.food.Food;

public class Main {
    public static void main(String[] args) {

        /**
         * 创建一个学生
         */
        Student student = new Student();
        student.setName("小久");

        //小久去食堂吃饭
        /**
         *  小鸡炖蘑菇
         *  番茄炒鸡蛋
         *  青椒肉丝
         *  红烧肉
         */
        Food food = FoodMangerFactor.getFood("青椒肉丝");
        student.setFood(food);
        student.eat();

    }
}

6)运行结果如下

1.红烧肉

2.小鸡炖蘑菇

3.青椒肉丝

4.番茄炒鸡蛋

如何增加新的菜品?

以增加红烧鱼

1)通过food接口实现新的菜品红烧鱼

java 复制代码
package org.xiji.easyFactory.food.impl;

import org.xiji.easyFactory.food.Food;

/**
 * 红烧鱼
 */
public class BraisedFishInBrownCauce implements Food {
    @Override
    public String getFood() {
        return "红烧鱼";
    }
}

2)修改FoodMangerFactor里面的代码

java 复制代码
package org.xiji.easyFactory;

import org.xiji.easyFactory.food.Food;
import org.xiji.easyFactory.food.impl.*;

/**
 * 食堂阿姨
 */
public class FoodMangerFactor {

    public static Food getFood(String foodName)
    {
        if(foodName.equals("小鸡炖蘑菇"))
        {
            return new ChickenStewWithMushrooms();
        }
        else if(foodName.equals("番茄炒鸡蛋"))
        {
            return new ScrambledEggsWithTomatoes();
        }
        else if(foodName.equals("青椒肉丝"))
        {
            return new PepperSteak();
        }
        else if(foodName.equals("红烧肉"))
        {
            return new BraisedPork();
        } 
        //下面是新增代码
        else if (foodName.equals("红烧鱼")) {

            return new BraisedFishInBrownCauce();
        }

        return null;
    }
}

运行结果如下

相关推荐
哦虎!2 小时前
【JavaEE】网络初识
java
for_ever_love__2 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓3 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡3 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室4 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项4 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼4 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠4 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y4 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python