1 基本介绍
假如现在有这样一个水果店的项目需求:
① 水果的种类很多(苹果、芒果、橙子、西瓜等);
② 完成水果店的在线订购功能,要求便于扩展,便于维护。
2 代码演示
2.1 简单实现
创建抽象类Fruit
public abstract class Fruit {
public abstract void make();
}
创建水果类:苹果、芒果、橙子、西瓜等
// 苹果
public class Apple extends Fruit {
@Override
public void make() {System.out.println("准备苹果");}
}
// 芒果
public class Mango extends Fruit {
@Override
public void make() {System.out.println("准备芒果");}
}
// 橙子
public class Orange extends Fruit {
@Override
public void make() {System.out.println("准备橙子");}
}
// 西瓜
public class Watermelon extends Fruit {
@Override
public void make() {System.out.println("准备西瓜");}
}
创建类订购水果
public class FruitOrder {
public void addFruit(String fruitType) {
Fruit fruit = null;
if ("apple".equals(fruitType)) {
fruit = new Apple();
} else if ("orange".equals(fruitType)) {
fruit = new Orange();
} else if ("mango".equals(fruitType)) {
fruit = new Mango();
} else if ("watermelon".equals(fruitType)) {
fruit = new Watermelon();
}
}
}
创建类:水果店
public class FruitStore {
public static void main(String[] args) {
FruitOrder fo = new FruitOrder();
fo.addFruit("mango");
fo.addFruit("watermelon");
}
}
分析:当我们需要新增水果或者销售的模式的时候,甚至有多种订购方案的时候,是需要修改很多代码的,FruitOrder这个类相当于时使用者或者客户端,当你添加功能的时候就需要修改里面的代码,违反了设计原则的开闭原则,即对扩展开放,对修改关闭。下面进行修改。
2.2 简单工厂模式
简介:属于创建型模式,是工厂模式的一种,由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式中最简单实用的模式。
操作:定义一个创建对象的类,由这个类来封装实例化对象的行为。
使用场景:在现实开发中,当我们会大量用到创建某种、某类或者某批对象时,就会使用到工厂模式。
// 创建一个简单工厂,对水果创建抽出以工厂创建水果
public class SimpleFruitFactory {
public Fruit makeFruit(String fruitType) {
// 也可以写成静态的方法
// public static Fruit makeFruit(String fruitType) {
Fruit fruit = null;
if ("apple".equals(fruitType)) {
fruit = new Apple();
} else if ("orange".equals(fruitType)) {
fruit = new Orange();
} else if ("mango".equals(fruitType)) {
fruit = new Mango();
} else if ("watermelon".equals(fruitType)) {
fruit = new Watermelon();
}
return fruit;
}
}
// 修改FruitOrder这个类
public class FruitOrder {
// 聚合方式
/*private SimpleFruitFactory fruitFactory;
public void setFactory(SimpleFruitFactory fruitFactory) {
this.fruitFactory = fruitFactory;
}*/
// 组合方式
private SimpleFruitFactory fruitFactory = new SimpleFruitFactory();
public void addFruit(String fruitType) {
// 如果是静态的工厂模式
// Fruit fruit = SimpleFruitFactory.makeFruit(fruitType);
Fruit fruit = fruitFactory.makeFruit(fruitType);
if (fruit == null) {
System.out.println("该水果卖完了。。。");
return;
}
}
}
分析:将水果抽取到简单工厂,后面再增加水果,我们的客户端类就不需要修改代码了,只需要在工厂中进行更改就可以了,增强了软件的可拓展性、可维护性。
2.3 工厂方法模式
如果在上述的案例的中,增加功能:比如水果的售卖方式由直接卖、水果捞、水果果盘、果汁等等。增加有多种形式的售卖方式,这里的实现方法就不一样了,这时候就可以使用工厂方法模式。
设计方案:将水果的实例化方法抽出成抽象方法,在不同的实现中体现出来。
工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
// 直接售卖
public class Sell extends FruitOrder {
public void sellFruit() { System.out.println("直接售卖水果"); }
}
// 做成水果捞进行售卖
public class SellMix extends FruitOrder {
public void sellFruit() { System.out.println("做成水果捞进行售卖"); }
}
// 做成水果果盘进行售卖
public class SellCompote extends FruitOrder {
public void sellFruit() { System.out.println("做成水果果盘进行售卖"); }
}
// 做成果汁进行售卖
public class SellJuice extends FruitOrder {
public void sellFruit() { System.out.println("做成果汁进行售卖"); }
}
public abstract class FruitOrder {
private SimpleFruitFactory fruitFactory = new SimpleFruitFactory();
// 定义一个方法,sellFruit,让各个工厂子类自己实现
public abstract void sellFruit();
public void addFruit(String fruitType) {
Fruit fruit = fruitFactory.makeFruit(fruitType);
if (fruit == null) {
System.out.println("该水果卖完了。。。");
return;
}
}
}
public class FruitStore {
public static void main(String[] args) {
FruitOrder fo = new SellJuice();
fo.addFruit("mango");
fo.addFruit("watermelon");
fo.sellFruit();
FruitOrder fo1 = new SellMix();
fo1.addFruit("apple");
fo1.addFruit("orange");
fo1.sellFruit();
}
}
分析:在这里FruitOrder就充当着工厂的角色