23种设计模式2_工厂模式

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就充当着工厂的角色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑吧,高同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值