工厂方法(Factory Method) -- (模式之八)

1.背景

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

2.概念
工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor)或者多态性工厂模式(Polymorphic Factory),在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一产品创建的细节。

3.类图

   1).示意图

2).建模图形

从上图可以看出,工厂方法模式的系统涉及到了以下角色:
   抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。
  具体工厂角色:实现了抽象工厂接口的具体Java类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
  抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
    具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。

4.代码示例

package factory;
/**
 * 工厂的抽象类
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public interface Factory {
/**
* 生产一个水果
* @return
*/
public Fruit factory();
}


ackage factory;
/**
 * 苹果工厂
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public class AppleFactory implements Factory{


@Override
public Fruit factory() {
Fruit fruit = new Apple();
System.out.println("水果工厂,创建了苹果,"+fruit.getClass());
return fruit;
}


}

package factory;
/**
 * 香蕉工厂
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public class BananaFactory implements Factory{


@Override
public Fruit factory() {
Fruit fruit = new Banana();
System.out.println("水果工厂,创建了香蕉,"+fruit.getClass());
return fruit;
}

}

package factory;
/**
 * 产品的抽象类
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public interface Fruit {
/**
* 种植果树
*/
public void plant();

/**
* 果树生长
*/
public void grow();
}

package factory;

/**

 *  苹果的实体类
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public class Apple implements Fruit{
@Override
public void plant() {
System.out.println("Apple is planted!");
}
@Override
public void grow() {
System.out.println("Apple is growing!");
}
}

/**
 * 香蕉的实体类
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public class Banana implements Fruit{
@Override
public void plant() {
System.out.println("banana is planted!");
}
@Override
public void grow() {
System.out.println("banana is growing!");
}
}

package factory;
/**
 * 测试类
 * @author lvzh
 * date 2011.10.31
 * address 于曙光
 */
public class Test {
public static void main(String[] args){
Factory fct = new AppleFactory();
Factory fctba = new BananaFactory();
Fruit fft = fct.factory();//苹果
Fruit ffba = fctba.factory();//香蕉
fft.grow();
ffba.grow();
}
}

//测试结果

水果工厂,创建了苹果,class factory.Apple
水果工厂,创建了香蕉,class factory.Banana
Apple is growing!
banana is growing!

5.应用场景
只要我们使用new关键字的地方我们都可以考虑是否可以换成,工厂模式来统一为我们创建实例,很多时候是工厂模式和单列模式混合起来使用,假入我们获取数据库连接,不同的数据库使用不同的连接,我们就可以使用工厂模式,java API中的日期来也使用了工厂模式来获取实例,

6.总结技术要点
1).工厂方法使得一个类的创建延迟到其子类当中去了;
2).使用了多态,父类的引用指向了子类的实例变量;
3).一种类型返回另外一种类型的实例




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值