做一个设计模式,对现实生活中的某一简单问题场景进行设计并编程实现。要求采用工厂方法模式的至少3种实现方式编写代码,并给出运行结果。 实验目的是什么呢
时间: 2023-12-14 12:36:52 浏览: 86
设计模式—简单工厂编程实例
实验目的是通过设计模式的实现,加深对工厂方法模式的理解,并掌握在不同场景下使用该模式的方法和技巧。同时,通过编程实现,提升自己的编程能力和代码质量。
以下是一个简单的场景:假设我们要设计一个制作饮料的程序,饮料有咖啡、奶茶和果汁三种类型。每种类型的饮料又可以有不同的配料,如咖啡可以加糖、牛奶或奶泡等,奶茶可以加珍珠、椰果或红豆等,果汁可以加蜂蜜、柠檬或草莓等。现在我们需要使用工厂方法模式来实现这个场景。
首先,我们需要定义一个饮料接口,其中包括制作饮料和添加配料的方法:
```java
public interface Drink {
void make();
void addIngredient();
}
```
然后,我们定义三个具体的饮料类,分别是Coffee(咖啡)、MilkTea(奶茶)和Juice(果汁),每个类实现饮料接口,并重写制作饮料和添加配料的方法:
```java
public class Coffee implements Drink {
@Override
public void make() {
System.out.println("制作咖啡");
}
@Override
public void addIngredient() {
System.out.println("加入糖");
}
}
public class MilkTea implements Drink {
@Override
public void make() {
System.out.println("制作奶茶");
}
@Override
public void addIngredient() {
System.out.println("加入珍珠");
}
}
public class Juice implements Drink {
@Override
public void make() {
System.out.println("制作果汁");
}
@Override
public void addIngredient() {
System.out.println("加入蜂蜜");
}
}
```
接下来,我们使用工厂方法模式来创建饮料对象。首先,我们定义一个饮料工厂接口,其中包括创建饮料和添加配料的方法:
```java
public interface DrinkFactory {
Drink createDrink();
void addIngredient(Drink drink);
}
```
然后,我们分别使用三种不同的实现方式来实现这个工厂接口。
1. 简单工厂模式
简单工厂模式是最基本的工厂模式,它的核心思想是将对象的创建与使用分离,通过一个工厂类来创建对象。在我们的场景中,我们可以创建一个简单工厂类来负责创建饮料对象:
```java
public class SimpleDrinkFactory implements DrinkFactory {
@Override
public Drink createDrink() {
return new Coffee();
}
@Override
public void addIngredient(Drink drink) {
drink.addIngredient();
}
}
```
在这个简单工厂类中,我们通过createDrink方法来创建饮料对象,并在addIngredient方法中添加配料。
下面是测试代码:
```java
DrinkFactory factory = new SimpleDrinkFactory();
Drink drink = factory.createDrink();
drink.make();
factory.addIngredient(drink);
```
输出结果为:
```
制作咖啡
加入糖
```
2. 工厂方法模式
工厂方法模式是将工厂类抽象出来,让子类来决定实例化哪个类。在我们的场景中,我们可以创建一个抽象工厂类来负责创建饮料对象:
```java
public abstract class AbstractDrinkFactory {
public void makeDrink() {
Drink drink = createDrink();
drink.make();
addIngredient(drink);
}
protected abstract Drink createDrink();
protected abstract void addIngredient(Drink drink);
}
public class CoffeeFactory extends AbstractDrinkFactory {
@Override
protected Drink createDrink() {
return new Coffee();
}
@Override
protected void addIngredient(Drink drink) {
drink.addIngredient();
}
}
public class MilkTeaFactory extends AbstractDrinkFactory {
@Override
protected Drink createDrink() {
return new MilkTea();
}
@Override
protected void addIngredient(Drink drink) {
drink.addIngredient();
}
}
public class JuiceFactory extends AbstractDrinkFactory {
@Override
protected Drink createDrink() {
return new Juice();
}
@Override
protected void addIngredient(Drink drink) {
drink.addIngredient();
}
}
```
在这个抽象工厂类中,我们定义了一个makeDrink方法,它会分别调用createDrink和addIngredient方法来创建饮料对象并添加配料。
下面是测试代码:
```java
AbstractDrinkFactory factory = new CoffeeFactory();
factory.makeDrink();
```
输出结果为:
```
制作咖啡
加入糖
```
3. 工厂方法模式 + 反射机制
工厂方法模式可以实现灵活的对象创建,但是需要创建多个具体工厂类。在我们的场景中,我们可以通过反射机制来简化工厂类的创建,从而实现更加灵活的对象创建。
```java
public class ReflectionDrinkFactory implements DrinkFactory {
private String className;
public ReflectionDrinkFactory(String className) {
this.className = className;
}
@Override
public Drink createDrink() {
try {
Class<?> clazz = Class.forName(className);
return (Drink) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void addIngredient(Drink drink) {
drink.addIngredient();
}
}
```
在这个反射工厂类中,我们通过传入类名来创建对象,并在addIngredient方法中添加配料。
下面是测试代码:
```java
DrinkFactory factory = new ReflectionDrinkFactory("com.example.designpatterns.factorymethod.MilkTea");
Drink drink = factory.createDrink();
drink.make();
factory.addIngredient(drink);
```
输出结果为:
```
制作奶茶
加入珍珠
```
通过以上实现,我们可以看到不同的工厂方法模式实现方式可以在不同的场景下发挥作用,同时也能够更好地理解和掌握工厂方法模式的使用方法。
阅读全文