标签:
工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂方法模式的结构:
抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中,这个角色由java接口“抽象工厂”扮演;在实际的系统中,这个角色也常常使用抽象java类实现。
具体工厂角色:担任这个角色的是实现了抽象工厂接口的具体java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在本系统中给出了三个这样的角色,也就是具体java类。
抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象共同父类或共同拥有的接口。在本系统中,这个角色由java接口抽项产品扮演;在实际的系统中,这个角色也常常使用抽象java类实现。
具体产品角色:这个角色实现了抽象产品所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
例如:
抽象工厂类是工厂方法模式的核心,但是它并不掌握水果类或蔬菜类的生杀大权。相反地,这项权利被交给子类,即AppleGardener StawberryGardener以及GrapeGardener。
代码清单:
抽象产品类
public interface Fruit {
/**
* 生长
*/
void grow();
/**
* 收获
*/
void harvest();
/**
* 种植
*/
void plan();
}
具体产品角色(苹果)
public class Apple implements Fruit
{
private int treeAge;
/**
* 生长
*/
public void grow()
{
log("Apple is growing...");
}
/**
* 收获
*/
public void harvest()
{
log("Apple has been harvested.");
}
/**
* 种植
*/
public void plan()
{
log("Apple has been planted.");
}
/**
* 辅助方法,打印日志
* @param msg
*/
public void log(String msg)
{
System.out.println(msg);
}
/**
* 树龄的取值方法
* @return treeAge
*/
public int getTreeAge() {
return treeAge;
}
/**
* 树龄的赋值方法
* @param treeAge
*/
public void setTreeAge(int treeAge) {
this.treeAge = treeAge;
}
}
具体产品角色(葡萄)
public class Grape implements Fruit
{
private boolean seedless;
/**
* 生长
*/
public void grow()
{
log("Grape is growing...");
}
/**
* 收获
*/
public void harvest()
{
log("Grape has been harvested.");
}
/**
* 种植
*/
public void plan()
{
log("Grape has been planted.");
}
/**
* 辅助方法,打印日志
* @param msg
*/
public void log(String msg)
{
System.out.println(msg);
}
/**
* 获取是否有籽
* @return seedless
*/
public boolean isSeedless() {
return seedless;
}
/**
* 设置是否有籽
* @param seedless
*/
public void setSeedless(boolean seedless) {
this.seedless = seedless;
}
}
具体产品角色(草莓)
public class Strawberry implements Fruit
{
/**
* 生长
*/
public void grow()
{
log("Strawberry is growing...");
}
/**
* 收获
*/
public void harvest()
{
log("Strawberry has been harvested.");
}
/**
* 种植
*/
public void plan()
{
log("Strawberry has been planted.");
}
/**
* 辅助方法,打印日志
* @param msg
*/
public void log(String msg)
{
System.out.println(msg);
}
}
抽象工厂类
public interface FruitGardener
{
/**
* 工厂方法
*/
public Fruit factory();
}
具体工厂类(苹果)
public class AppleGardener implements FruitGardener {
public Fruit factory() {
return new Apple();
}
}
具体工厂类(葡萄)
public class GrapeGardener implements FruitGardener {
public Fruit factory() {
return new Grape();
}
}
具体工厂类(草莓)
public class StrawberryGardener implements FruitGardener {
public Fruit factory() {
return new Strawberry();
}
}
标签:
原文地址:http://blog.csdn.net/liu904139492/article/details/44134697