设计模式之简单工厂模式

简单工厂模式概念

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

运行结果如下

相关推荐
让学习成为一种生活方式1 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画7 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生30 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink43 分钟前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田1 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人1 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea
小冉在学习1 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
代码之光_19802 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi2 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet