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中的集合类

    父类定义:

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

  • 相关阅读:
    【LeetCode-栈】栈排序
    【LeetCode-数组】旋转数组
    【LeetCode-数组】两个数组的交集 II
    【LeetCode-树】二叉树的层次遍历 II
    【LeetCode-字符串】Fizz Buzz
    【LeetCode-数组】数组的相对排序
    解决Oracle表中数据乱码的问题
    docker搭建mysql 用户名密码忘记了怎么办
    java中如何将string 转化成long
    http三次握手四次挥手
  • 原文地址:https://www.cnblogs.com/weixk/p/12866813.html
Copyright © 2011-2022 走看看