`
javatar
  • 浏览: 1681125 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

Builder接口重构

    博客分类:
  • HTTL
阅读更多
MeteorTL(http://www.meteortl.org)以前的(0.5.1以前)版本中的API接口为:
TemplateFactory 和 ContextFactory 用于创建 Template 和 Context 两个核心 Domain,
Factory 用于合并 TemplateFactory 和 ContextFactory 两个工厂,
Builder 用于创建 Factory,
Engine 实现 Builder,通过Builder接口一步步导航到其它接口,

然而一直感觉Builder接口很不顺眼,
因为它与core包中的其它接口内聚性不高,
它只是作为core包其它接口的使用者,而不是被core包其它接口使用,或继承于core包其它接口等更强一点的关联,并且不是核心Domain。
有几个版本试图将它移到engine包,但发现也并不妥善,
因为整体架构声明engine包用于实现core包所有接口,

仔细研究Builder的实现类Engine, 发现其持有一个不合理的Configuration状态,
public interface Builder {
	Factory buildFactory();
}

public class Engine implements Builder {

	private Configuration config;

	public Engine(Configuration config) {
		this.config = config;
	}

	public Factory buildFactory() {
		// 通过config信息创建一个Factory接口的实例并返回
	}

}

用户调用方式:
Factory Factory = new Engine(config).buildFactory();




问题在于config只在一次建造过程有效,Engine类持有它毫无意义,重构如下:
public interface Builder {
	Factory buildFactory(Configuration config);
}

public class Engine implements Builder {

	public Factory buildFactory(Configuration config) {
		// 通过config信息创建一个Factory接口的实例并返回
	}

}

用户调用方式:
Factory Factory = new Engine().buildFactory(config);


但这样Builder就会依赖于Configuration接口,
而按整体架构core包是不能依config包的,
所以只能把Builder移到engine包,
发现Engine实例的存在也没起任何作用,再重构为:
Factory Factory = Engine.buildFactory(config);

这样,Builder接口就应该删除,

在我试着删掉Builder接口后, 猛然发现Engine如果直接实现Factory会更合理,如:
public class Engine implements Factory {

	public Engine(Configuration config) {
		// 通过config信息建造自身
	}

	public Template getTemplate(String name, String encoding) {
		...
	}

	...

}

用户调用方式:
Factory Factory = new Engine(config);


总结:
当发现放在哪都不合理的类或接口,或许它本身就不应该存在。
分享到:
评论

相关推荐

    重构与模式.[美]Joshua Kerievsky(带详细书签).pdf

    本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新方法,而且有助于读者结合...

    LightweightCTI.rar_C++builder _lightweightCTI_东进_语音卡

    LightweightCTI是一套旨在帮助开发人员迅速构建语音相关应用的一套开放源代码的基础框架,目前你下载和使用的是构建于Pwin2000+ + Delphi/C++Builder环境下的框架,所有的基础性代码使用Pascal语言完成。...

    单片机与DSP中的一种基于Nios II的可重构DSP系统设计

    由于可编程的NiosII核含有许多可配置的接口模块,用户可根据设计要求,利用QuartusII和SOPC Builder对NiosII及其外围系统进行构建。用户还可通过Matlab和DSP Builder,或直接用VHDL等硬件描述语言,为NiosII嵌入式...

    C++设计模式原理与实战视频课

    2-1 简单工厂方法的定义场景与实现-针对接口编程的设计思想剖析 2-2 简单工厂实用工程技术:C++对象动态创建技术与配置化开发 2-3 单例模式的定义场景与实现:懒汉、饿汉与多线程安全double checking 2-4 单例模式的...

    ObjectBuilder2:C ++ CASE工具,完整的生命周期代码生成器-开源

    我使用它,并且认为面向C ++的树OO接口比UML类图更快速,更强大。 ObjectBuilder可以完美组织各种复杂程度的C ++头文件。 即使在OO层次结构中使用循环引用,也只需要包含一个项目级头文件。 您可以通过在项目内部...

    二十三种设计模式【PDF版】

    在真正可复用的面向对象编程中,GoF 的《设计模式》为我们提供了一套可复用的面向对象技术,再配合 Refactoring(重构方法), 所以很少存在简单重复的工作,加上Java 代码的精炼性和面向对象纯洁性(设计模式是 java 的...

    Jump-In-Board-Game:Sysc 3110项目

    @author丹麦屁股这是该项目... 第二个更改是创建了一个Level Builder类来构建新的关卡。 第三个变化是创建了一个Moving Piece界面。 该接口仅由狐狸和兔子使用。 最后的更改是重构了许多先前的代码(尤其是求解器类)。

    Delphi模式编程第一分卷

    第6章 建造者模式(Builder) 6.1 模式解说 6.2 结构和用法 6.2.1 模式结构 6.2.2 代码模板 6.3 范例与实践 6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(Singleton) 7.1 模式...

    Delphi模式编程第二分卷

    第6章 建造者模式(Builder) 6.1 模式解说 6.2 结构和用法 6.2.1 模式结构 6.2.2 代码模板 6.3 范例与实践 6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(Singleton) ...

    基于知识图谱的数据录入+知识检索python有源码+项目说明+数据(结构化数据选取所需数据进行数据整合).zip

    - [X] 重构,添加一点问题,完善问答的鲁棒性 -21\12\25 # 一,项目介绍 数据来源:[老刘说NLP作者的一个仓库中的人物关系数据集]...

    数据库学习基础之名词解释

    Informix不仅可以建立数据库,还可以方便地重构数据库,系统的保护措施十分健全,不仅能使数据得到保护而不被权限外的用户存取,且能重新建立丢失了的文件及恢复被破坏了的数据。其文件的大小不受磁盘空间的限制,域...

    C#设计模式大全

    四、 接口隔离原则(ISP) 五、 合成/聚合复用原则(CARP) 六、 迪米特法则(LoD) C#设计模式(4)-Simple Factory Pattern 一、 简单工厂(Simple Factory)模式 二、 Simple Factory模式角色与结构: 三...

    GOLF设计模式(C++语言版)

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一...

    《设计模式》中文版(23个设计模式的介绍与运用)

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一...

    设计模式(Design.Patterns.CHN)

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一...

    JAVA经典设计模式大全

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究...

    软件设计师必读的书-设计模式

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一...

    设计模式 design pattern

    1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一...

    设计模式--C++

    3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton(单件)—对象创建型模式 84 3.6 创建型模式的讨论 89 第 4...

Global site tag (gtag.js) - Google Analytics