




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。类型:创建类模式类图:工厂方法模式代码[java]
\o"viewplain"viewplain\o"copy"copyinterface
IProduct
{
public
void
productMethod();
}
class
Product
implements
IProduct
{
public
void
productMethod()
{
System.out.println("产品");
}
}
interface
IFactory
{
public
IProduct
createProduct();
}
class
Factory
implements
IFactory
{
public
IProduct
createProduct()
{
return
new
Product();
}
}
public
class
Client
{
public
static
void
main(String[]
args)
{
IFactory
factory
=
new
Factory();
IProduct
prodect
=
factory.createProduct();
ductMethod();
}
}
工厂模式:
首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经常用到的一种模式。它的主要优点有:可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。
工厂方法模式:
通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。
前文提到的简单工厂模式跟工厂方法模式极为相似,区别是:简单工厂只有三个要素,他没有工厂接口,并且得到产品的方法一般是静态的。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱,可以算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。
适用场景:
不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。
首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。
再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。
典型应用对应图中的参与者如下:产品:定义了工厂方法创建对象的接口。具体产品:实现产品的接口。工厂(创建者):定义了工厂方法的抽象类并返回一个产品对象。具体工厂:该类实现和覆盖了父工厂类声明的方法。客户端(例如类A)想要使用被具体工厂类(类B)创建的产品。这样的话,客户端仅持有接口B的引用而不是对象‘类B’,这样就不需要知道任何有关类B的资源,事实上可以有多个类实现抽象类。工厂方法模式类允许子类来决定实例化哪一个类,这意味着什么?它基本上意味着工厂抽象类在不知道实际的具体产品角色类将被实例化为什么的情况下就能编码,例如它是裤子还是衬衫,这完全取决于具体的工厂类。现在让我们实现上述模式的商品服装厂(GarmentFactory)例子。让我们先做一些吧,我们不会为具体的产品例如Shirt.java和Trouser.java而重复写代码。这可以在工厂模式这篇文章中找到。用户正面临着一个新的工厂抽象类的建立。123publicabstractclassFactory{
protectedabstractGarmentTypecreateGarments(Stringselection);}服装工厂类需要修改来继承抽象工厂类。12345678910publicclassGarmentFactoryextendsFactory{
publicGarmentTypecreateGarments(Stringselection){
if(selection.equalsIgnoreCase('Trouser')){
returnnewTrouser();
}elseif(selection.equalsIgnoreCase('Shirt')){
returnnewShirt();
}
thrownewIllegalArgumentException('Selectiondoesnotexist');
}}客户端类指的是用工厂类和createGarments(选择)类的工厂方法在运行的时候创建产品。123Factoryfactory=newGarmentFactory();GarmentTypeobjGarmentType=factory.createGarments(selection);System.out.println(objGarmentType.print());好处:代码灵活,松耦合和可复用性,将对象创建的代码从客户端移到了工厂类,那就是它的子类。这非常易于维护相关代码,因为对象的创建非常集中。客户端代码只处理产品的接口,因此可以无需修改客户端的逻辑代码就能添加任何具体的产品。工厂方法的优势之一就是可以多次返回相同的实例,或者可以返回一个子类而不是一个具体类型的对象。它鼓励通过工厂
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中兽医基础知到课后答案智慧树章节测试答案2025年春黑龙江农业工程职业学院(松北校区)
- 广东江门幼儿师范高等专科学校《流行舞》2023-2024学年第一学期期末试卷
- 上海第二工业大学《广联达软件实训》2023-2024学年第一学期期末试卷
- 河北地质大学《执业医师考试实践技能培训》2023-2024学年第一学期期末试卷
- 关于墨汁容器造型设计问卷调查
- 外网排水施工方案
- 桥梁施工方案编制计划
- 2025年中考语文一轮复习:文学类文本阅读 讲义
- 天津市河西区2024-2025学年高一上学期期末质量调查数学试题(解析版)
- 河北省邢台市2024-2025学年高二上学期期末英语测试试题【含答案】
- 农村土地流转合同范本
- 个人借款分期还款合同
- 道德与法治研修日志
- 船舶起重吊装作业安全方案
- 2023年佛山市三水区乐平镇镇属国有企业招聘笔试真题
- T-GXAS 395-2022 蒜头果栽培技术规程
- 品管圈PDCA改善案例-降低高危患者夜间如厕跌倒发生率
- 2024年电梯销售工作计划(三篇)
- 凉山州 2024 年教师综合业务素质测试试卷初中物理
- 石英砂生产流程培训
- 工地团队劳务合同范例
评论
0/150
提交评论