zoukankan      html  css  js  c++  java
  • 工厂方法模式

    一、工厂模式介绍

    1、定义与类型

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

    2、使用场景

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

    3、优点

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

    4、缺点

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

    二、 代码示例

    抽象产品类:

    public abstract class Video {
        public abstract void produce();
    }

    实现产品类1:

    public class PythonVideo extends Video {
        @Override
        public void produce() {
            System.out.println("录制Python课程视频");
        }
    }

    实现产品类2:

    public class JavaVideo extends Video {
        @Override
        public void produce() {
            System.out.println("录制Java课程视频");
        }
    }

    实现产品类3:

    public class FEVideo extends Video{
        @Override
        public void produce() {
            System.out.println("录制FE课程视频");
        }
    }

    抽象工厂类:

    public abstract class VideoFactory {
        public abstract Video getVideo();
    }

    实现工厂类1:

    public class JavaVideoFactory extends VideoFactory {
        @Override
        public Video getVideo() {
            return new JavaVideo();
        }
    }

    实现工厂类2:

    public class PythonVideoFactory extends VideoFactory {
        @Override
        public Video getVideo() {
            return new PythonVideo();
        }
    }

    实现工厂类3:

    public class FEVideoFactory extends VideoFactory{
        @Override
        public Video getVideo() {
            return new FEVideo();
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            VideoFactory videoFactory = new PythonVideoFactory();
            VideoFactory videoFactory2 = new JavaVideoFactory();
            VideoFactory videoFactory3 = new FEVideoFactory();
            Video video = videoFactory.getVideo();
            video.produce();
        }
    }

    类图:

    三、 源码示例

    1、JDK中的集合类

    父类定义:

    子类实现,并返回特定的“产品类”:

  • 相关阅读:
    BZOJ 5297: [Cqoi2018]社交网络 矩阵树定理
    BZOJ 5300: [Cqoi2018]九连环 打表+FFT
    BZOJ 5298: [Cqoi2018]交错序列 二项式定理+矩阵乘法
    BZOJ 5301: [Cqoi2018]异或序列 莫队+桶
    BZOJ 5324: [Jxoi2018]守卫 区间DP
    BZOJ 5322: [Jxoi2018]排序问题 模拟+贪心
    点斜式
    斜截式
    斜率
    求线段的交点
  • 原文地址:https://www.cnblogs.com/weixk/p/12866813.html
Copyright © 2011-2022 走看看