工厂方法(Factory-Method)模式_第1页
工厂方法(Factory-Method)模式_第2页
工厂方法(Factory-Method)模式_第3页
工厂方法(Factory-Method)模式_第4页
工厂方法(Factory-Method)模式_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.2

工厂方法(FactoryMethod)模式

工厂方法模式是类的创建模式,又叫虚拟构造子(VirtualConstructor)模式或者多态性工厂(PolymorphicFactory)模式。

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。

1.2.1

工厂方法模式的引进

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。下面是工厂方法模式的缩略类图:

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具工厂子类必须实现的接口,而不接触哪一产品创建的细节。

这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。

1.2.2

工厂方法模式的结构

在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下:

从上图可以看出,工厂方法模式的系统涉及到了以下角色:

抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。

具体工厂角色:实现了抽象工厂接口的具体Java类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。

抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。

1.2.3

工厂方法模式在农场系统中的实现

1.2.3.1

背景

在简单工厂模式中,有个全能的园丁,控制所有作物的种植、生长和收获。现在农场规模变大了,管理更加专业化了。过去全能的园丁没有了,每一种作物都有专门的园丁管理,形成了规模化和专业化生产。

1.2.3.2

系统设计机构图

1.2.3.3

实现源码

1.2.3.3.1

水果产品接口Fruit.java

packagecom.lavasoft.patterns.factorymethod.ybms;/**

*工厂模式--工厂方法模式--一般性模式(农场应用)

*ReadMe:

水果接口

*/

publicinterfaceFruit{

/**

*种植

*/

voidplant();

/**

*生长

*/

voidgrow();

/**

*收获

*/

voidharvest();

}

publicFruitfactory();

}

1.2.3.3.6

苹果工厂:AppleGardener.java

packagecom.lavasoft.patterns.factorymethod.ybms;/**

*工厂模式--工厂方法模式--一般性模式(农场应用)

*ReadMe:

苹果工厂方法

*/

publicclassAppleGardenerimplementsFruitGardener{

/**

*工厂方法

*

*@return苹果

*/

publicFruitfactory(){

Fruitf=newApple();

System.out.println("水果工厂(AppletGardener)成功创建一个水果:苹果!");

returnf;

}

}

1.2.3.3.7

葡萄工厂:GrapeGardener.java

packagecom.lavasoft.patterns.factorymethod.ybms;/**

*工厂模式--工厂方法模式--一般性模式(农场应用)

*ReadMe:

添加说明

*/

publicclassGrapeGardenerimplementsFruitGardener{

/**

*工厂方法

*@return葡萄

*/

publicFruitfactory(){

Fruitf=newGrape();

System.out.println("水果工厂(GrapeGardener)成功创建一个水果:葡萄!");

returnf;

}

}

1.2.3.3.8

草莓工厂:StrawberryGardener.java

packagecom.lavasoft.patterns.factorymethod.ybms;/**

*工厂模式--工厂方法模式--一般性模式(农场应用)

*ReadMe:

添加说明

*/

publicclassStrawberryGardenerimplementsFruitGardener{

/**

*工厂方法

*@return草莓

*/

publicFruitfactory(){

Fruitf=newStrawberry();

System.out.println("水果工厂(StrawberryGardener)成功创建一个水果:草莓!");

returnf;

}

}

1.2.3.3.9

测试类(客户端):TestApp.java

packagecom.lavasoft.patterns.factorymethod.ybms;/**

*工厂模式--工厂方法模式--一般性模式(农场应用)

*ReadMe:

测试类(客户端)

*/

publicclassTestApp{

privateFruitGardenerf1,f2,f3;

privateFruitp1,p2,p3;

privatevoidtest(){

//实力化水果工厂

f1=newAppleGardener();

f2=newGrapeGardener();

f3=newStrawberryGardener();

//从水果工厂生产水果

p1=f1.factory();

p2=f2.factory();

p3=f3.factory();

}

publicstaticvoidmain(Stringargs[]){

TestApptest=newTestApp();

test.test();

}

}

1.2.3.3.10

测试运行结果

水果工厂(AppletGardener)成功创建一个水果:苹果!

水果工厂(GrapeGardener)成功创建一个水果:葡萄!

水果工厂(StrawberryGardener)成功创建一个水果:草莓!

Processfinishedwithexitcode0

1.2.3.4

关于工厂方法模式的实现

在下面我简单说说一些实现方式,不做详细分析了。

1.使用java接口或者java抽象类

2.使用多个工厂方法

3.产品循环使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论