zoukankan      html  css  js  c++  java
  • java设计模式——工厂模式

    一. 定义与类型

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

    类型:创建型

    二. 使用场景

    创建对象需要大量重复的代码

    客户端(应用层)不依赖于产品类实例如何被创建,实现等细节

    一个类通过其子类来指定创建哪个类

    三. 优缺点

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

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

    四. coding

    我们还是以上一篇的简单工厂的video为例。在原来的基础上做一定的修改,符合开闭原则。

    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-13 16:50
     **/
    public abstract class VideoFactory {
    
        public abstract Video getVideo();
    
    }

    抽象工厂类中的具体工厂对象video(这个也是抽象的,只是对于抽象工厂来说,是具体的)

    /**
     * @program: designModel
     * @description: 视频类
     * @author: YuKai Fan
     * @create: 2018-11-13 16:46
     **/
    public abstract class Video {
        public abstract void product();
    }

    具体的实体类,是继承video:

    /**
     * @program: designModel
     * @description: java视频类
     * @author: YuKai Fan
     * @create: 2018-11-13 16:47
     **/
    public class JavaVideo extends Video {
        public void product() {
            System.out.println("录制java课程视频");
        }
    }
    /**
     * @program: designModel
     * @description: Python视频类
     * @author: YuKai Fan
     * @create: 2018-11-13 16:48
     **/
    public class PythonVideo extends Video {
        public void product() {
            System.out.println("录制Python课程视频");
        }
    }

    具体的工厂类,是用来创建具体的实体对象的:

    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-21 11:05
     **/
    public class JavaVideoFactory extends VideoFactory {
        public Video getVideo() {
            return new JavaVideo();
        }
    }
    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-21 11:06
     **/
    public class PythonVideoFactory extends VideoFactory {
        public Video getVideo() {
            return new PythonVideo();
        }
    }

    客户端:

    /**
     * @program: designModel
     * @description:
     * @author: YuKai Fan
     * @create: 2018-11-13 16:48
     **/
    public class Test {
        public static void main(String[] args) {
            VideoFactory videoFactory = new JavaVideoFactory();
            Video video = videoFactory.getVideo();
            video.product();
        }
    }

    UML类图:

    五. 源码分析

    jdk中的集合框架Collect中的Iterate方法就是采用抽象工厂的方式实现,还是日志矿机的logback的getLogger也是。

  • 相关阅读:
    PPP点对点协议
    Wireshark包过滤
    asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦
    sql学习笔记(三)—— 联表查询
    Sql学习笔记(二)—— 条件查询
    bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 ——中位数排序
    汕头市队赛 SRM19 字符题
    bzoj 2037: [Sdoi2008]Sue的小球——dp
    bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
    【BZOJ】3302: [Shoi2005]树的双中心 && 2103: Fire 消防站 && 2447: 消防站
  • 原文地址:https://www.cnblogs.com/FanJava/p/9965138.html
Copyright © 2011-2022 走看看