码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式(Factory Method)

时间:2015-03-08 18:50:40      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:



工厂方法模式是类的创建模式,又叫做虚拟构造子(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();
 }

}





工厂方法模式(Factory Method)

标签:

原文地址:http://blog.csdn.net/liu904139492/article/details/44134697

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!