工厂方法FactoryMethod模式.docx
- 文档编号:10465935
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:11
- 大小:38.27KB
工厂方法FactoryMethod模式.docx
《工厂方法FactoryMethod模式.docx》由会员分享,可在线阅读,更多相关《工厂方法FactoryMethod模式.docx(11页珍藏版)》请在冰豆网上搜索。
工厂方法FactoryMethod模式
工厂方法(Factory-Method)模式
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();
}
1.2.3.3.2 具体产品苹果Apple.java
packagecom.lavasoft.patterns.factorymethod.ybms;
/**
*工厂模式--工厂方法模式--一般性模式(农场应用)
*ReadMe:
水果工厂的产品:
苹果
*/
publicclassAppleimplementsFruit{
privateinttreeAge;
/**
*种植
*/
publicvoidplant(){
System.out.println("Applehasbeenplanted.");
}
/**
*生长
*/
publicvoidgrow(){
System.out.println("Appleisgrowing...");
}
/**
*收获
*/
publicvoidharvest(){
System.out.println("Applehasbeenharvested.");
}
/**
*@return返回树龄
*/
publicintgetTreeAge(){
returntreeAge;
}
/**
*设置树龄
*/
publicvoidsetTreeAge(inttreeAge){
this.treeAge=treeAge;
}
}
1.2.3.3.3 具体产品葡萄:
Grape.java
packagecom.lavasoft.patterns.factorymethod.ybms;
/**
*工厂模式--工厂方法模式--一般性模式(农场应用)
*ReadMe:
水果工厂的产品:
葡萄
*/
publicclassGrapeimplementsFruit{
privatebooleanseedless; //是否有籽
/**
*种植
*/
publicvoidplant(){
System.out.println("Grapehasbeenplanted.");
}
/**
*生长
*/
publicvoidgrow(){
System.out.println("Grapeisgrowing...");
}
/**
*收获
*/
publicvoidharvest(){
System.out.println("Grapehasbeenharvested.");
}
/**
*@return是否有籽
*/
publicbooleangetSeedless(){
returnseedless;
}
/**
*有无籽的赋值方法
*/
publicvoidsetSeedless(booleanseedless){
this.seedless=seedless;
}
/**
*辅助方法
*/
publicstaticvoidlog(Stringmsg){
System.out.println(msg);
}
}
1.2.3.3.4 具体产品草莓:
Strawberry.java
packagecom.lavasoft.patterns.factorymethod.ybms;
/**
*工厂模式--工厂方法模式--一般性模式(农场应用)
*ReadMe:
水果工厂的产品:
草莓
*/
publicclassStrawberryimplementsFruit{
/**
*生长
*/
publicvoidgrow(){
System.out.println("Strawberryisgrowing...");
}
/**
*收获
*/
publicvoidharvest(){
System.out.println("Strawberryhasbeenharvested.");
}
/**
*种植
*/
publicvoidplant(){
System.out.println("Strawberryhasbeenplanted.");
}
/**
*辅助方法
*/
publicstaticvoidlog(Stringmsg){
System.out.println(msg);
}
}
1.2.3.3.5 水果工厂接口:
FruitGardener.java
packagecom.lavasoft.patterns.factorymethod.ybms;
/**
*工厂模式--工厂方法模式--一般性模式(农场应用)
*ReadMe:
水果工厂接口
*/
publicinterfaceFruitGardener{
/**
*工厂方法
*
*@return水果
*/
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.产品循环使用λ
4.多态性的丧失和模式的退化,主要体现在工厂方法创建对象、工厂方法返回的类型、工厂等级结构三个方面。
λ
1.2.3.5 女娲举绳造人
女娲举绳造人是工厂方法模式的一个实例。
下面仅仅给出设计图如下,具体编码请您自己实现。
呵呵,学会了简单工厂模式再来学工厂方法,是不是很容易啊,看懂农场一个例子就够了,多实践多思考比什么都好!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工厂 方法 FactoryMethod 模式
![提示](https://static.bdocx.com/images/bang_tan.gif)