码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法

时间:2019-05-04 00:44:38      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:rac   code   rri   图片   extends   抽象   http   python   对象   

定义

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

类型

创建型

适用场景

  1. 创建对象需要大量的代码
  2. 客户端(应用层代码)不依赖于产品类实例如何被创建、实现等细节
  3. 一个类通过其子类来指定创建哪个对象

优点

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

缺点

  1. 类的数量过多,增加复杂度(添加新产品时,需要加上产品类与其对应的工厂类)
  2. 增加了系统的抽象性和理解难度

Coding

实现工厂方法

技术图片

// 对于某些行为、属性是已知时, 使用抽象类
// 均为未知时, 可以使用接口
public abstract class VideoFactory {
    public abstract Video getVideo();
}
public class JavaVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }
}
// 具体产生什么, 由子类决定, 不会由 VideoFactory 决定
// VideoFactory 只定义规范、契约,不决定产生什么
public class PythonVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }
}
public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        // 想要 Python 的,只要把工厂重新指向 Python 工厂就行了
        //  VideoFactory videoFactory = new PythonVideoFactory();

        Video video = videoFactory.getVideo();
        video.produce();
    }

}

对比简单工厂

如果此时需要加上 FEVideo,在简单方法的实现中,就需要在工厂中,再新增一个 if 了

        // 优雅吗??
        if ("java".equalsIgnoreCase(type)) {
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
            return new PythonVideo();
        } else if ("fe".equalsIgnoreCase(type)) {
            return new FEVideo();
        }
        return null;

在工厂方法中,当需要新增 FEVideo 时,我们只需要创建 FEVideo 和 FEVideoFactory。

工厂方法

标签:rac   code   rri   图片   extends   抽象   http   python   对象   

原文地址:https://www.cnblogs.com/Zhouxuan-C/p/10806954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!