博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【重构与模式】6.3 用Factory封装类
阅读量:6155 次
发布时间:2019-06-21

本文共 1942 字,大约阅读时间需要 6 分钟。

hot3.png

  当直接实例化处在同一包结构中、实现统一接口的多个类。可以把类的构造函数声明为非公共的,并通过Factory来创建它们的实例

(针对多个类:把多个类的构造方法先creation method,之后提取到工厂类中)

public abstract class AttributeDescriptor {    protected AttributeDescriptor() {    }    public void sayHello() {    }}public class IntegerDescriptor extends AttributeDescriptor {    public IntegerDescriptor() {        super();    }    public void sayHello() {        System.out.println("I am integer method");    }}public class BooleanDescriptor extends AttributeDescriptor {    public BooleanDescriptor() {        super();    }    public void sayHello() {        System.out.println("I am boolean method");    }}public class ReferenceDescriptor extends AttributeDescriptor {    public ReferenceDescriptor() {        super();    }    public void sayHello() {        System.out.println("I am reference method");    }}

重构之后:

public abstract class AttributeDescriptor {	protected AttributeDescriptor(){			}	public void sayHello(){	}	public AttributeDescriptor forInteger(){		return new IntegerDescriptor();	}	public AttributeDescriptor forBoolean(){		return new BooleanDescriptor();	}	public AttributeDescriptor forReference(){		return new ReferenceDescriptor();	}}public class IntegerDescriptor extends AttributeDescriptor{	public void sayHello(){		System.out.println("I am integer method");	}}public class BooleanDescriptor extends AttributeDescriptor{	public void sayHello(){		System.out.println("I am boolean method");	}}public class ReferenceDescriptor extends AttributeDescriptor{	public void sayHello(){		System.out.println("I am reference method");	}}
AttributeDescriptor a = AttributeDescriptor.forInteger();		a.sayHello();
动机:
  可以通过Factory将一组客户并不需关心的子类屏蔽到包内部。
  如果类共享一个通用的公共接口、共享相同的超类、并且处在同一包结构中,该重构可能有用。
优缺点:
  + 通过意图导向的Creation Method简化了不同种类实例的创建
  + 通过隐藏不需要公开的类减少了包的“概念重量”
  + 帮助严格执行“面向接口编程,而不是面向实现”这一格言
  - 当需要创建新种类的实例时,必须更新Creation Method

  - 当客户只能获得Factory的二进制代码而无法获得源码时,对Factory的定制将受到限制

转载于:https://my.oschina.net/u/1182234/blog/164259

你可能感兴趣的文章
在VMware网络测试“专用VLAN”功能
查看>>
使用Formik轻松开发更高质量的React表单(三)<Formik />解析
查看>>
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>
CSS引入的方式有哪些? link和@import的区别?
查看>>
Redis 介绍2——常见基本类型
查看>>
asp.net开发mysql注意事项
查看>>
(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器
查看>>
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>