Java设计模式(四)工厂方法模式
定义与类型
- 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
- 类型:创建型
适用场景
- 创建对象需要大量重复的代码
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
- 一个类通过其子类来指定创建哪个对象
优点
- 用户只需要关心所需产品对应的工厂,无须关心创建细节
- 加入新产品符合开闭原则,提高可扩展性
缺点
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
Coding
工厂方法模式从一定意义上讲是从简单工厂模式衍生过来的,创建产品抽象类
public abstract class Video {
    public abstract void produce();
}
创建具体产品
public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java课程");
    }
}
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Python视频");
    }
}
创建产品工厂方法抽象类
public abstract class VideoFactory {
    public abstract Video getVideo();
}
创建产品工厂方法实现类(每个产品都有对应的实现类)
public class JavaVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }
}
public class PythonVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }
}
测试类
public class Test {
    public static void main(String[] args) {
        VideoFactory javaVideoFactory = new JavaVideoFactory();
        VideoFactory pythonVideoFactory = new PythonVideoFactory();
        Video video = javaVideoFactory.getVideo();
        video.produce();
        video = pythonVideoFactory.getVideo();
        video.produce();
    }
}
控制台输出
录制Java课程
录制Python视频
如果我们现在新增一个产品--前端课程,我们需要创建产品类,产品工厂类,但是无需改动其他代码,做到了对扩展开放,对修改关闭,符合开闭原则。
public class FEVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制前端课程");
    }
}
public class FEVideoFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new FEVideo();
    }
}
但是,我们也不难看出工厂方法模式的缺点--类的个数容易过多,增加复杂度。
因为一旦我们需要现在产品,就需要创建产品对应的产品实现类,以及产品工厂方法类,无疑增加了类的个数和系统的复杂度。
完整的UML类图

源码解析
Collection源码
jdk中典型的工厂方法模式体现为java.util.Collection
抽象产品为java.util.Iterator
public interface Iterator<E> {
	...
}
抽象工厂定义了创建产品族的方法java.util.Collection.#iterator
Iterator<E> iterator();
由子类来定义具体创建产品的逻辑,如java.util.ArrayList.#iterator
public Iterator<E> iterator() {
    return new Itr();
}
而具体的产品定义为java.util.ArrayList$Itr
private class Itr implements Iterator<E> {
    ...
}
UML类图

URLStreamHandlerFactory源码
再来看一个典型例子,java.net.URLStreamHandlerFactory作为工厂方法抽象类,定义了创建产品的抽象方法
public interface URLStreamHandlerFactory {
    URLStreamHandler createURLStreamHandler(String protocol);
}
产品抽象类就是java.net.URLStreamHandler
public abstract class URLStreamHandler {
    ...
}
产品的工厂方法实现类为sun.misc.Launcher$Factory
private static class Factory implements URLStreamHandlerFactory {
    ...
    public URLStreamHandler createURLStreamHandler(String var1) {
        private static String PREFIX = "sun.net.www.protocol";
        private Factory() {
        }
        public URLStreamHandler createURLStreamHandler(String var1) {
            String var2 = PREFIX + "." + var1 + ".Handler";
            try {
                // 通过反射创建指定类型的产品
                Class var3 = Class.forName(var2);
                return (URLStreamHandler)var3.newInstance();
            } catch (ReflectiveOperationException var4) {
                throw new InternalError("could not load " + var1 + "system protocol handler", var4);
            }
        }
    }
}
可以发现,工厂实现类通过反射类创建具体的产品实现类,而产品实现类非常多

这样满足了开闭原则,也没有过多的增加类的数量,值得我们学习。
Java设计模式(四)工厂方法模式的更多相关文章
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
		1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ... 
- Java设计模式之工厂方法模式(转)  实现是抽象工厂?
		Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ... 
- Java设计模式系列-工厂方法模式
		原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ... 
- java设计模式(二)---工厂方法模式
		2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ... 
- Java设计模式 之 工厂方法模式
		1. 使用设计模式的好处:可提高代码的重复性,让代码更容易被他人理解,保证代码的可靠性. 2. 工厂模式定义:就是创建一个工厂类来创建你需要的类,工厂模式包括工厂模式和抽象工厂模式,抽象工厂模式是工厂 ... 
- JAVA设计模式之工厂方法模式
		在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ... 
- 【java】 java 设计模式(1):工厂方法模式(Factory Method)
		工厂方法模式分为三种: 1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口: p ... 
- Java设计模式(2)——工厂方法模式
		工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ... 
- java设计模式学习 ----- 工厂方法模式(Factory Method)
		工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ... 
- C#设计模式(3)——工厂方法模式
		一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ... 
随机推荐
- HDU6183 Color it (线段树动态开点)
			题意: 一个1e6*1e6的棋盘,有两个操作:给(x,y)加上颜色c,或查找(1,y1)到(x,y2)内的颜色种类数量,最多有50种颜色 思路: 建立50颗线段树,对每个颜色的线段树,维护每个y坐标上 ... 
- Asp.Net Core IdentityServer4 管理面板集成
			前言 IdentityServer4(以下简称 Id4) 是 Asp.Net Core 中一个非常流行的 OpenId Connect 和 OAuth 2.0 框架,可以轻松集成到 Asp.Net C ... 
- 【python-leetcode713-双指针】乘积小于k的子数组
			问题描述: 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于10 ... 
- FTP - File Transfer Protocol
			FTP - File Transfer Protocol FTP 实际上使用了两个 TCP 链接. 一个作为控制信道用, 主要传输一些指令和响应, 比如 ACK 或 错误码. 另一个链接是数据信道, ... 
- MySQL中大数据表增加字段,增加索引实现
			MySQL中大数据表增加字段,通过增加索引实现 普通的添加字段sql ALTER TABLE `table_name` ADD COLUMN `num` int(10) NOT NULL DEFAUL ... 
- android wifi断开原因分析
			最近在解bug的过程中经常遇到密码正确但处于saved的状态,总结原因有已下几种: 1 在ASSOCIATING阶段由于丢包导致ASSOC REJECT 03-16 09:22:12.440 D/Wi ... 
- np.vstack与np.hstack
			转自:https://zhuanlan.zhihu.com/p/82996332 留作备忘 
- ASP.NET Core MVC学习笔记
			最近由于疫情紧张,遂在家办公,在领导的带领下,学习了一下.Net Core MVC. 一,构建web应用 1.选择c#-所有平台-web 找到ASP.NET Core web应用程序 2.项目命名之 ... 
- 微信小程序入门笔记-审核上线(5)
			1.点击上传 2.填写版本号.备注 3.https://mp.weixin.qq.com/回到微信公众平台,点击版本管理就可以看到开发版本 4.点击提交审核(提交之前填写小程序基本资料,才可提交审核) ... 
- AndroidStudio报错:Emulator: I/O warning : failed to load external entity "file:/C:/Users/Administrator/.AndroidStudio3
			场景 在进行Android Studio的.Android Studio目录从C盘修改为其他目录后,新建App启动提示: Emulator: I/O warning : failed to load ... 
