社区
Java
帖子详情
高手能否说说说Factory和Builder类?给100分
pastoral
2002-10-18 01:19:34
在javax.xml包里面发现这几种类型的类,能不能深入浅出的讲讲?
100分重谢。
...全文
88
15
打赏
收藏
高手能否说说说Factory和Builder类?给100分
在javax.xml包里面发现这几种类型的类,能不能深入浅出的讲讲? 100分重谢。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
知足常乐
2002-10-25
打赏
举报
回复
若对其它模式也感兴趣,请连接:
http://www.pigtwo.com/forum/list.asp?boardid=11
里面收藏了很多模式的示例代码。
在此声明:所有模式都是本人通过各种途径收藏的,非本人亲自写的。不过还是欢迎大家一起共享!
richardluopeng
2002-10-25
打赏
举报
回复
大家不要老是抄文章,好吗?讨论讨论可能比较好!
tpz_stamp
2002-10-24
打赏
举报
回复
呵呵,那是我自己的简单而不成熟的理解。
不过我想,设计这些类的设计师也肯定是想达到 观其名,会其意的效果,力求避免名不符实。
XKP
2002-10-23
打赏
举报
回复
好文章
顶一下
tpz_stamp
2002-10-22
打赏
举报
回复
呵呵,受教育了。不过我可没乱说。只是说的很土并且不够确切而已。看大家怎么具体理解。
wangwei1998
2002-10-22
打赏
举报
回复
真他妈的好文章啊。
DanielYWoo
2002-10-22
打赏
举报
回复
这些东西,就是应用才能理解,
尤其摔了很多跟头之后。
这些模式很简单,但怎样应用就难了。
这个荒版怎么帖子这么少?呵呵。
weimenren
2002-10-22
打赏
举报
回复
其实tpz到是有了自己的总结,不过总结的不够彻底而已,
DanielYWoo(绿色毒汁) 的总结彻底一点,不过我想我们只有在实际的运用中才能真正的体会到其中的差别。
知足常乐
2002-10-21
打赏
举报
回复
真的很好是网站:
http://www.jdon.com/designpatterns/index.htm
知足常乐
2002-10-21
打赏
举报
回复
Factory
定义:提供创建对象的接口.
为何使用?
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
我们以类Sample为例, 如果我们要创建Sample的实例对象:
Sample sample=new Sample();
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。
首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:
Sample sample=new Sample(参数);
但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。
为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。
这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:
Sample mysample=new MySample();
Sample hissample=new HisSample();
随着项目的深入,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.
但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.
工厂方法
你会建立一个专门生产Sample实例的工厂:
public class Factory{
public static Sample creator(int which){
//getClass 产生Sample 一般可使用动态类装载装入类。
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
那么在你的程序中,如果要实例化Sample时.就使用
Sample sampleA=Factory.creator(1);
这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.
使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample,如下图,最右边是生产的对象Sample:
进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类concreteFactory了。
抽象工厂
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).
这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.
这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类Sample2A和SampleB2
那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,下面就是将上例中的Factory拓展成抽象工厂:
public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
public Sample creator(){
.........
return new SampleA
}
public Sample2 creator(String name){
.........
return new Sample2A
}
}
public class BombFactory extends Factory{
public Sample creator(){
......
return new SampleB
}
public Sample2 creator(String name){
......
return new Sample2B
}
}
从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问,为什么我不可以使用两个工厂方法来分别生产Sample和Sample2?
抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,生产Sample和生产Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫SimpleFactory。
在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用,
举例
我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过,现在再讨论其工厂模式:
public abstract class ForumFactory {
private static Object initLock = new Object();
private static String className = "com.jivesoftware.forum.database.DbForumFactory";
private static ForumFactory factory = null;
public static ForumFactory getInstance(Authorization authorization) {
//If no valid authorization passed in, return null.
if (authorization == null) {
return null;
}
//以下使用了Singleton 单态模式
if (factory == null) {
synchronized(initLock) {
if (factory == null) {
......
try {
//动态转载类
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
return null;
}
}
}
}
//Now, 返回 proxy.用来限制授权对forum的访问
return new ForumFactoryProxy(authorization, factory,
factory.getPermissions(authorization));
}
//真正创建forum的方法由继承forumfactory的子类去完成.
public abstract Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException;
....
}
因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:
private static String className = "com.jivesoftware.forum.database.DbForumFactory";
你可以使用自己开发的创建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.
在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.
看看Java宠物店中的CatalogDAOFactory:
public class CatalogDAOFactory {
/**
* 本方法制定一个特别的子类来实现DAO模式。
* 具体子类定义是在J2EE的部署描述器中。
*/
public static CatalogDAO getDAO() throws CatalogDAOSysException {
CatalogDAO catDao = null;
try {
InitialContext ic = new InitialContext();
//动态装入CATALOG_DAO_CLASS
//可以定义自己的CATALOG_DAO_CLASS,从而在无需变更太多代码
//的前提下,完成系统的巨大变更。
String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);
catDao = (CatalogDAO) Class.forName(className).newInstance();
} catch (NamingException ne) {
throw new CatalogDAOSysException("
CatalogDAOFactory.getDAO: NamingException while
getting DAO type : \n" + ne.getMessage());
} catch (Exception se) {
throw new CatalogDAOSysException("
CatalogDAOFactory.getDAO: Exception while getting
DAO type : \n" + se.getMessage());
}
return catDao;
}
}
CatalogDAOFactory是典型的工厂方法,catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类,这个实现子类在Java宠物店是用来操作catalog数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类,将自
nielinjie
2002-10-21
打赏
举报
回复
呵呵,不要生气,俺对事不对人的。
nielinjie
2002-10-21
打赏
举报
回复
tpz基本是乱说。
DanielYWoo
2002-10-20
打赏
举报
回复
不完全同意Tpz
Builder本身强调创建的步骤繁琐,而且可被重用,
重新组合,所以他自己不能创建对象,需要在
Director的指导下,才使这种关系完整。
Factory很简单的,只不过是把构造责任延迟给子类而已,
多态的表现之一,学C++的时候就应该知道了,不用多说了。
Builder通过Director的指导,分步精细的构造对象,
最后返回给客户,所以Builder的方法都是原子方法,
具备普遍性,可以被重新组合以生成不同个性的产品。
xmvigour
2002-10-18
打赏
举报
回复
http://www.jdon.com/designpatterns/index.htm
看看上面的例子 也许跟xml不沾边 但多少可以触类旁通:)
tpz_stamp
2002-10-18
打赏
举报
回复
Factory一般用来生成Builder
好比一个工厂,有很多的工人,
干活的时候工厂就招募工人干活。
Factory 招募 Builder 做具体的事情。
如何用form-
builder
快速构建现代化表单?零基础入门到实战指南
想要快速构建现代化的表单系统吗?form-
builder
是一个强大的PHP表单生成器,能够帮助开发者快速生成现代化的表单界面,支持前后端
分
离开发模式。这个实用的工具内置了17种常用表单组件,已经在政务系统、OA系统、ERP系统、电商系统、流程管理等各
类
系统中稳定应用。无论你是PHP初学者还是经验丰富的开发者,这份完整的form-
builder
入门指南将带你从零基础到实战应用。 ## 🔥 为什么
【AI论文】SWE-
Factory
:您的自动化工厂,提供问题解决培训数据和评估基准
摘要:本文提出SWE-
Factory
自动化流水线,用于构建GitHub问题解决任务的大规模数据集。针对传统方法在评估环境搭建、测试结果评定和任务验证上的高成本问题,该系统整合了三大核心组件:(1) SWE-
Builder
多智能体系统,通过四个协作智能体和环境记忆池自动构建评估环境;(2) 基于退出代码的标准化评
分
方法,无需人工解析测试日志;(3) 利用退出代码自动验证fail2pass条件。实验表明,该系统在671个多语言问题上表现高效——GPT-4.1-mini以0.045美元/实例构建269个有效实例,
追MM与Java的23种设计模式[转]
1、
FACTORY
—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员
说
“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的
Factory
工厂模式:客户
类
和工厂
类
分
开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂
类
也要做相应的修改。如:如何创建及如何向客户...
Java - 用
builder
代替构造器
静态工厂和够构造器有一个共同的局限性:遇到大量的参数时无法很好的扩展。 先
说
说
构造器。 其实field不多时重叠构造器(telescoping constructor)是个不错的方法,易于编写也易于调用,这种方式在参数数量较少时也很常见。 但问题是参数很多(可能越来越多)时,比如(现在已经很难找到对多个参数进行重叠构造的代码了,于是在这里直接引用一下书中的代码): publ...
MFC和设计模式
MFC不是唯一一个使用了设计模式的程序库,也不可能是唯一的一个。可以肯定的
说
,所有好的框架必然是充满了好的设计模式。本文的目的在于提醒大家学习框架时,运用设计模式的理论和思想去理解其中众多的
类
之间的联系,从整体的角度去学习部
分
,显然比从部
分
去理解整体有更好的效果。本文的后面会给出MFC中的一些设计模式。 但是,不得不悲哀的看到,MFC中的核心
类
CWnd(不知道的先拖下去打)违反了框架设计
Java
51,407
社区成员
86,116
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章