工厂方法(Factory-Method)模式
发布时间:2020-04-14 来源:文档文库
小
中
大
字号:
工厂方法(Factory-Method模式
1.2 工厂方法(Factory Method)模式
工厂方法模式是类的创建模式,又叫虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。
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 package com.lavasoft.patterns.factorymethod.ybms; /** * 工厂模式--工厂方法模式--一般性模式(农场应用)
* ReadMe: 水果接口
*/ public interface Fruit { /** * 种植 */ void plant(;
/** * 生长 */ void grow(; /** * 收获 */ void harvest(; } 1.2.3.3.2 具体产品苹果Apple.java package com.lavasoft.patterns.factorymethod.ybms; /** * 工厂模式--工厂方法模式--一般性模式(农场应用)
* ReadMe: 水果工厂的产品:苹果
*/ public class Apple implements Fruit
{ private int treeAge;
/** * 种植 */ public void plant( { System.out.println("Apple has been planted."; } /** * 生长 */ public void grow( { System.out.println("Apple rowing..."; } /** * 收获 */ public void harvest( { System.out.println("Apple been harvested."; } is ghas
/** * @return 返回树龄 */ public int getTreeAge( { return treeAge; } /** * 设置树龄 */ public void setTreeAge(int treeAge { this.treeAge = treeAge; } }
1.2.3.3.3 具体产品葡萄:Grape.java package com.lavasoft.patterns.factorymethod.ybms; /** * 工厂模式--工厂方法模式--一般性模式(农场应用)
* ReadMe: 水果工厂的产品:葡萄
*/ public class Grape implements Fruit
{ private boolean seedless; //是否有籽