设计模式之简单工厂模式

简单工厂模式概念

简单工厂模式(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;
    }
}

运行结果如下

相关推荐
暮乘白帝过重山3 分钟前
设计模式篇:灵活多变的策略模式
设计模式·策略模式
lifallen5 分钟前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
深栈解码44 分钟前
JMM深度解析(三) volatile实现机制详解
java·后端
liujing102329291 小时前
Day04_刷题niuke20250703
java·开发语言·算法
Brookty1 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
能工智人小辰1 小时前
二刷 苍穹外卖day10(含bug修改)
java·开发语言
DKPT1 小时前
Java设计模式之结构型模式(外观模式)介绍与说明
java·开发语言·笔记·学习·设计模式
缘来是庄1 小时前
设计模式之外观模式
java·设计模式·外观模式
你是橙子那我是谁1 小时前
设计模式之外观模式:简化复杂系统的优雅之道
设计模式
知其然亦知其所以然2 小时前
JVM社招面试题:队列和栈是什么?有什么区别?我在面试现场讲了个故事…
java·后端·面试