设计模式之简单工厂模式

简单工厂模式概念

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

运行结果如下

相关推荐
m0_719084118 分钟前
天机学堂aaaa
java
孙鹏宇.14 分钟前
左值右值.
java·开发语言
XDHCOM18 分钟前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
风吹迎面入袖凉19 分钟前
【Redis】Redisson分布式锁原理
java·服务器·开发语言
QCzblack20 分钟前
BugKu BUUCTF ——Reverse
java·前端·数据库
Orange_sparkle24 分钟前
learn claude code学习记录-S02
java·python·学习
李白你好25 分钟前
Java GUI-未授权漏洞检测工具
java·开发语言
aq55356001 小时前
四大编程语言对比:PHP、Python、Java、易语言
java·python·php
成为大佬先秃头1 小时前
前后分离项目:整合JWT+Shiro
java·springboot·shiro·jwt
y = xⁿ1 小时前
【Leet Code 】滑动窗口
java·算法·leetcode