设计模式-工厂方法模式

概述

  • 定义 : 定义一个创建对象的接口, 但让实现这个接口的类来决定实例化哪个类, 工厂方法让类的实例化推迟到子类中进行
  • 类型 : 创建型设计模式

模式角色

  • Product : 定义工厂方法所创建的对象的接口
  • ConcreteProduct : Product接口的实现
  • Creator : 声明工厂方法,该方法返回一个Product类型的对象。也可以定义一个工厂方
    法的缺省实现,它返回一个缺省的ConcreteProduct对象。
  • ConcreteCreator : 重定义工厂方法以创建一个ConcreteProduct实例

适用场景

  • 创建对象需要大量重复的代码
  • 客户端不依赖于产品类实例如何被创建, 实现等细节
  • 一个类通过其子类来指定创建哪个对象

优点

  • 用户只需要关系所需产品对应的工厂, 无需关心创建细节
  • 加入新产品符合开闭原则, 提高可扩展性

缺点

  • 类的个数容易过多, 增加复杂度
  • 增加了系统的抽象性和理解难度

代码演示

代码整体UML类图 :
在这里插入图片描述

Juice接口, 对应模式中Product角色, 代码如下 :

/**
 * 果汁接口类
 * @author 七夜雪
 * @create 2018-11-22 10:15
 */
public interface Juice {
    public String showName();;
}

接口实现类, 对应模式中ConcreteProduct角色, 下面是多个实现类代码:

/**
 * 橙汁
 *
 * @author 七夜雪
 * @create 2018-11-22 10:15
 */
public class OrangeJuice implements Juice {
    @Override
    public String showName() {
        return "橙汁";
    }
}
/**
 * 西瓜汁
 *
 * @author 七夜雪
 * @create 2018-11-22 10:23
 */
public class WatermelonJuice implements Juice {
    @Override
    public String showName() {
        return "西瓜汁";
    }
}
/**
 * 苹果汁
 *
 * @author 七夜雪
 * @create 2018-11-22 10:17
 */
public class AppleJuice implements Juice {
    @Override
    public String showName() {
        return "苹果汁";
    }
}

每个产品都有对应的工厂类, 对应模式中的Creator角色:

/**
 * 橙汁工厂
 *
 * @author 七夜雪
 * @create 2018-11-22 11:33
 */
public class OrangeJuiceFactory extends JuiceFactory {

    @Override
    public Juice getJuice() {
        return new OrangeJuice();
    }
}
/**
 * 西瓜汁工厂
 *
 * @author 七夜雪
 * @create 2018-11-22 11:33
 */
public class WatermelonJuiceFactory extends JuiceFactory {
    @Override
    public Juice getJuice() {
        return new WatermelonJuice();
    }
}
/**
 * 苹果汁工厂
 *
 * @author 七夜雪
 * @create 2018-11-22 11:33
 */
public class AppleJuiceFactory extends JuiceFactory {
    @Override
    public Juice getJuice() {
        return new AppleJuice();
    }
}

测试类代码 :

/**
 * 简单工厂测试类
 *
 * @author 七夜雪
 * @create 2018-11-22 10:23
 */
public class Test {
    public static void main(String[] args) {
        JuiceFactory factory1 = new OrangeJuiceFactory();
        Juice juice1 = factory1.getJuice();
        System.out.println(juice1.showName());
        JuiceFactory factory2 = new AppleJuiceFactory();
        Juice juice2 = factory2.getJuice();
        System.out.println(juice2.showName());
        JuiceFactory factory3 = new WatermelonJuiceFactory();
        Juice juice3 = factory3.getJuice();
        System.out.println(juice3.showName());
    }
}

本文参考:
慕课网<java设计模式精讲 Debug 方式+内存分析>课程
四人帮G<设计模式>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值