Java程序员的日常 —— 注册工厂的妙用
注册工厂是一种很常用的框架书写方法,它适合于快速创建相同类型的对象。
举个栗子
比如一个家具工厂,有沙发、椅子、茶几等等,正常的编程模式是这样的:
//创建
class 沙发{}
class 椅子{}
class 茶几{}
//使用
new 沙发();
new 椅子();
new 椅子();
new 茶几();
如果想要扩展,就需要继续定义class,然后new对象。
但是其实沙发的制作与使用时解耦的,使用者并不需要知道沙发、茶几是怎么制作出来的,只是想使用它而已。
使用注册工厂,相当于沙发、茶几、椅子都统一了一套创建方法,用户只需要去使用就行了。
参考下面的伪码:
//定义创建工厂
interface Factory<T>{
T create();
}
//对象继承这个工厂
class 沙发 extends 家具{
public static class Factory implements a.b.c.Factory<沙发>{
public 沙发 create(){ return new 沙发()}
}
}
class 茶几 extends 家具{
public static class Factory implements a.b.c.Factory<茶几>{
public 茶几 create(){ return new 茶几()}
}
}
class 椅子 extends 家具{
public static class Factory implements a.b.c.Factory<椅子>{
public 椅子 create(){ return new 椅子()}
}
}
//注册到工厂Map中
Map<String,Factory<? extends 家具>> map = new HashMap<>();
map.put("沙发",new 沙发.Factory());
map.put("椅子",new 椅子.Factory());
map.put("茶几",new 茶几.Factory());
//这样在使用的时候,就可以直接用它创建对象了
map.get("沙发").create()
详细代码
Factory.class
package xing.test.thinking.chap14;
public interface Factory<T> {
T create();
}
RegisteredFactories.class
package xing.test.thinking.chap14;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class Part {
public String toString(){
return getClass().getSimpleName();
}
static List<Factory<? extends Part>> partFactories = new ArrayList<Factory<? extends Part>>();//存放所有的对象工厂
//在静态块中添加对象工厂
static{
partFactories.add(new FuelFilter.Factory());
partFactories.add(new AirFilter.Factory());
partFactories.add(new CabinAirFilter.Factory());
partFactories.add(new OilFilter.Factory());
partFactories.add(new FanBelt.Factory());
partFactories.add(new PowerSteeringBelt.Factory());
partFactories.add(new GeneratorBelt.Factory());
}
private static Random rand = new Random(47);
public static Part createRandom(){
int n = rand.nextInt(partFactories.size());
return partFactories.get(n).create();
}
}
class Filter extends Part{}
class FuelFilter extends Filter {
public static class Factory implements xing.test.thinking.chap14.Factory<FuelFilter> {
public FuelFilter create(){
return new FuelFilter();
}
}
}
class AirFilter extends Filter {
public static class Factory implements xing.test.thinking.chap14.Factory<AirFilter> {
public AirFilter create(){
return new AirFilter();
}
}
}
class CabinAirFilter extends Filter {
public static class Factory implements xing.test.thinking.chap14.Factory<CabinAirFilter> {
public CabinAirFilter create(){
return new CabinAirFilter();
}
}
}
class OilFilter extends Filter {
public static class Factory implements xing.test.thinking.chap14.Factory<OilFilter> {
public OilFilter create(){
return new OilFilter();
}
}
}
class Belt extends Part{};
class FanBelt extends Belt {
public static class Factory implements xing.test.thinking.chap14.Factory<FanBelt> {
public FanBelt create(){
return new FanBelt();
}
}
}
class GeneratorBelt extends Belt {
public static class Factory implements xing.test.thinking.chap14.Factory<GeneratorBelt> {
public GeneratorBelt create(){
return new GeneratorBelt();
}
}
}
class PowerSteeringBelt extends Belt {
public static class Factory implements xing.test.thinking.chap14.Factory<PowerSteeringBelt> {
public PowerSteeringBelt create(){
return new PowerSteeringBelt();
}
}
}
public class RegisteredFactories {
public static void main(String[] args) {
for(int i=0 ; i<10 ; i++){
System.out.println(Part.createRandom());
}
}
}
Java程序员的日常 —— 注册工厂的妙用的更多相关文章
- Java程序员的日常——经验贴(纯干货)
工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...
- Java程序员的日常—— 《编程思想》关于类的使用常识
Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...
- Java程序员的日常—— Properties文件的读写
在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...
- Java程序员的日常—— 垃圾回收中引用类型的作用
在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...
- Java程序员的日常 —— 多进程开发
最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...
- Java程序员的日常——存储过程知识普及
存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器, ...
- Java程序员的日常 —— 《编程思想》持有对象
集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...
- Java程序员的日常 —— 工作一天的收获
看题目可能是扯皮,其实还是有很多专业知识的.从最开始没有注意到设计原则,到后面的jquery实战技巧,都是今天一天碰到的问题. 每天整理一点点,每天收获一点点. 关于软件设计 在设计系统结构的时候,一 ...
- Java程序员的日常—— Arrays工具类的使用
这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...
随机推荐
- sql server 删除所有 视图、存储过程
删除视图: use 数据库名 declare mycur cursor local for select [name] from dbo.sysobjects where xtype='V' --声 ...
- 快手 KSCAD 5.0 矢量图形设计软件
今天我的快手软件发布了一个最新版本 KSCAD 5.0,免费使用, 详情请看 www.timegis.com 快手 5.0 (KSCAD) 是一款简单易用的矢量绘图软件,其功能和Visio类似,可以绘 ...
- DWG2SHP DXF2SHP 如何把AutoCAD的DWG,DXF文件转换为Esri ArcGIS的Shape文件
dwg是AutoCAD创立的一种图纸保存格式,已经成为二维CAD的标准格式,很多其他CAD为了兼容AutoCAD,也直接使用dwg作为默认工作文件. 地图shape文件由ESRI开发,一个ESRI的s ...
- Win8.1下FreeImage.lib库的配置和简单使用(转)
转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/ 首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e). 配置 ...
- 关于H5本部缓存localStorage,sessionStorage
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...
- MATLAB不运行也不报错
今天本来挺激动找到能运行的好几个程序 MATLAB忙到busy也是停不下来 本来不以为然 结果呢 吃了个水果 一杯水都喝下去了 还没结果(⊙o⊙) 这时候解决办法只有一个 Ctrl+c
- 好玩儿的Game
1. 种类: 威佐夫游戏, Bash游戏, Nim游戏, 等. 2. 理论: 胜态一定可以通过某种策略走向必败态; 而必败态采取任何策略都将走向胜态. 用图论的话来说, 因为必败态只能走向胜态, 所以 ...
- E9相关技术链接
1.飞思卡尔i.MX6q安装ubuntu14.04操作系统:http://demo.netfoucs.com/bzw073/article/details/42551399 2. DS-5社区版安装: ...
- Python成长笔记 - 基础篇 (六)python模块
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...
- .NET环境下上传和下载Word文件
一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...