设计模式之简单工厂模式

简单工厂模式概念

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

运行结果如下

相关推荐
2501_941865631 小时前
从事件驱动到异步架构的互联网工程语法构建与多语言实践分享
java·开发语言·jvm
全靠bug跑7 小时前
Spring Cache 实战:核心注解详解与缓存过期时间配置
java·redis·springcache
聆风吟º8 小时前
【数据结构手札】空间复杂度详解:概念 | 习题
java·数据结构·算法
计算机程序设计小李同学8 小时前
基于SpringBoot的个性化穿搭推荐及交流平台
java·spring boot·后端
是一个Bug8 小时前
50道核心JVM面试题
java·开发语言·面试
朱朱没烦恼yeye8 小时前
java基础学习
java·python·学习
她和夏天一样热8 小时前
【观后感】Java线程池实现原理及其在美团业务中的实践
java·开发语言·jvm
郑州光合科技余经理9 小时前
技术架构:上门服务APP海外版源码部署
java·大数据·开发语言·前端·架构·uni-app·php
篱笆院的狗9 小时前
Java 中的 DelayQueue 和 ScheduledThreadPool 有什么区别?
java·开发语言
2501_941809149 小时前
面向多活架构与数据地域隔离的互联网系统设计思考与多语言工程实现实践分享记录
java·开发语言·python