Java设计模式从精通到入门四 工厂方法模式
工厂方法模式
属于23中设计模式中创建型类型。
核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类。
来源
设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟的为黑人,刚好的为黄种人的例子进行程序展示
女娲作为client,八卦炉为工厂类,人类为具体实现类,有皮肤的区别。
UML类图

图一
Factory: 工厂类的接口,根据类类型,提供只能创建Human子类,或者子孙类的方法。
HumanFactory: 工厂类的具体实现,通过反射获取该对象。
Human: 提供获取人类皮肤的接口。
WhiteHuman: Human的具体实现类
BlackHuman: Human的具体实现类
YellowHuman: Human的具体实现类
核心代码
Factory类:
public interface Factory {
/**
* @Author ouyangkang
* @Description 提供返回人类比较具体的实例
* @Date 10:04 2019/1/11
* @param c
* @return T
**/
<T extends Human> T getInstance(Class< ? extends Human> c);
}
HumanFactory类:
public class HumanFactory implements Factory {
/**
* @Author ouyangkang
* @Description 实现
* @Date 10:05 2019/1/11
* @param c
* @return T
**/
@Override
public <T extends Human> T getInstance(Class<? extends Human> c) {
if (c != null){
try {
return (T) c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return null;
}
}
Human类:
public interface Human {
/**
* @Author ouyangkang
* @Description 获取人类皮肤颜色
* @Date 10:05 2019/1/11
* @param
* @return void
**/
void getColor();
}
WhiteHuman类:
public class WhiteHuman implements Human {
@Override
public void getColor() {
System.out.println("白色人种");
}
}
BlackHuman类:
public class BlackHuman implements Human {
@Override
public void getColor() {
System.out.println("黑色人种");
}
}
YellowHuman类
public class YellowHuman implements Human {
@Override
public void getColor() {
System.out.println("黄色人种");
}
}
Client类
public class Client {
public static void main(String[] args) {
Factory factory = new HumanFactory();
Human instance = factory.getInstance(WhiteHuman.class);
instance.getColor();
factory.getInstance(BlackHuman.class).getColor();
factory.getInstance(YellowHuman.class).getColor();
}
}
输出结果:
白色人种
黑色人种
黄色人种
总结
工厂方法是一个非常常见的设计模式。Spring中有他的影子。它属于创建型模式,工厂父类提供创建产品对象的接口,具体的工厂类实现该接口,并创建相应的对象。这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。
Java设计模式从精通到入门四 工厂方法模式的更多相关文章
- Java设计模式从精通到入门一 责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...
- Java设计模式从精通到入门二 装饰器模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构. 应用实例: 给英雄联盟种的射手,添加不同的装备.先装备攻速 ...
- Java设计模式从精通到入门五 抽象工厂方法模式
定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...
- Java设计模式菜鸟系列(四)工厂方法模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method) 工厂方法:顾名思义,就是调用工 ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- 大话设计模式C++实现-第8章-工厂方法模式
一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2 ...
- [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式
github地址:https://github.com/cheesezh/python_design_patterns 简单工厂模式 v.s. 工厂方法模式 以简单计算器为例,对比一下简单工厂模式和工 ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
随机推荐
- Java 8 中的 Lambda 表达式
Lambda 表达式是 Java 8 最受欢迎的功能.人们将函数式编程的概念引入了 Java 这门完全面向对象的命令式编程语言. 关于函数式编程是如何运作的,这个话题超出了本文的范围,不过我们会提炼出 ...
- C++ 关于ShowWindow()的疑问
IDE: Code::Blocks 16.01 操作系统:Windows 7 x64 最初的代码,目的是为了隐藏窗口出现在任务栏上的图标. #include <windows.h> usi ...
- MySQL慢查询 - 开启慢查询
一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态 slow_ ...
- 论文阅读笔记三十七:Grid R-CNN(CVPR2018)
论文源址:https://arxiv.org/abs/1811.12030 开源代码:未公开 摘要 本文提出了目标检测网络Grid R-CNN,其基于网格定位机制实现准确的目标检测.传统方法主要基于回 ...
- 常见的爬虫分析库(2)-xpath语法
xpath简介 1.xpath使用路径表达式在xml和html中进行导航 2.xpath包含标准函数库 3.xpath是一个w3c的标准 xpath节点关系 1.父节点 2.子节点 3.同胞节点 4. ...
- 绘制ROC曲线
什么是ROC曲线 ROC曲线是什么意思,书面表述为: "ROC 曲线(接收者操作特征曲线)是一种显示分类模型在所有分类阈值下的效果的图表." 好吧,这很不直观.其实就是一个二维曲线 ...
- OpenJDK-study-001 windows上安装Mercurial 4.4.1 克隆OPENJDK版本库
下载安装 1.下载Mercurial 进入https://www.mercurial-scm.org/wiki/Mercurial下载,windows上傻瓜式安装的,安装好之后,命令行进入安装目录, ...
- [转] HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换
1.将String字符串转换成Blob对象 //将字符串 转换成 Blob 对象 var blob = new Blob(["Hello World!"], { type: 'te ...
- js高级程序设计
defer 异步脚本,脚本延迟到文档完全被解析和显示之后再执行.只对外部脚本文件有效.按顺序执行脚本.但在实际情况下,并不一定会按照顺序执行最好只有一个延迟脚本.支持H5的浏览器会忽略给脚本设置 de ...
- functiontools模块
#!/usr/bin/env python# -*- coding:utf-8 -*-from functools import cmp_to_key a = [1, 6, 4, 5]a.sort(k ...