简单工厂模式概念
简单工厂模式(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;
}
}
运行结果如下