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

    父类定义:

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

  • 相关阅读:
    UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)
    UVA 1572 Self-Assembly(拓扑排序)
    最大流当前弧优化Dinic分层模板
    POJ 3683.Priest John's Busiest Day 2-SAT
    n的m划分 整数拆分问题
    表达式计算
    大白书中无向图的点双联通分量(BCC)模板的分析与理解
    Codeforces 766D. Mahmoud and a Dictionary 并查集 二元敌对关系 点拆分
    树状数组入门
    Tire树入门专题
  • 原文地址:https://www.cnblogs.com/weixk/p/12866813.html
Copyright © 2011-2022 走看看