[设计模式-创建型]工厂方法(Factory Method)

概括

 

名称 Factory Method
结构

动机

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

适用性

  • 当一个类不知道它所必须创建的对象的类的时候。

  • 当一个类希望由它的子类来指定它所创建的对象的时候。

  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

 

 

解析

工厂方法模式在网络上有一个形象的比喻:

FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

    1.Product
      定义工厂方法所创建的对象的接口。

    2.ConcreteProduct
      实现Product接口。

    3.Creator
      声明工厂方法,该方法返回一个Product类型的对象*
      Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
      可以调用工厂方法以创建一个Product对象。

    4.ConcreteCreator
      重定义工厂方法以返回一个ConcreteProduct实例。



实例

可能看到这里还是不是很清楚。直接看例子好了。涉及的文件有

Product.java

   - SoftwareProduct.java

   -  HardwareProduct.java

Creator.java

   -  HardwareCreator.java

   -  SoftwareCreator.java

TestMain.java

在Product 里定义了一个接口方法 doWork(), SoftwareProduct和HardwareProduct分别实现了这个方法。

Creator里定义了一个接口方法getProduct(),SoftwareCreator和HardwareCreator分别实现了这个方法得到不同的 Product.


 

/**   
* @author oscar999   
* @date 2013-7-17
* @version V1.0   
*/
package designptn.factorymth;

public interface Product {
   void doWork();
}

 

/**   
 * @author oscar999   
 * @date 2013-7-17
 * @version V1.0   
 */
package designptn.factorymth;

public class SoftwareProduct implements Product {
	public void doWork() {
		System.out.println("product a Software.");
	}
}

 

/**   
 * @author oscar999   
 * @date 2013-7-17
 * @version V1.0   
 */
package designptn.factorymth;

public class HardwareProduct implements Product {
	public void doWork() {
		System.out.println("product a Hardware.");
	}
}

 

/**   
* @author oscar999   
* @date 2013-7-17
* @version V1.0   
*/
package designptn.factorymth;

public class SoftwareCreator implements Creator {

	public Product getProduct() {
		return new SoftwareProduct();
	}

}

 

/**   
 * @author oscar999   
 * @date 2013-7-17
 * @version V1.0   
 */
package designptn.factorymth;

public class HardwareCreator implements Creator {
	public Product getProduct() {
		return new HardwareProduct();
	}
}

 

/**   
 * @author oscar999   
 * @date 2013-7-17
 * @version V1.0   
 */
package designptn.factorymth;

public class TestMain {

	public static void main(String[] args) {
		Creator softwareCreator = new SoftwareCreator();
		Product softwareProduct = softwareCreator.getProduct();
		softwareProduct.doWork();

		Creator hardwareCreator = new HardwareCreator();
		Product hardwareProduct = hardwareCreator.getProduct();
		hardwareProduct.doWork();
	}

}

 

从Main 函数的调用来看, 通过不同的Creator,可以得到不同的Product, 而不需要关心具体的Product 是什么样的。



 

posted @ 2013-07-17 20:37  坚固66  阅读(167)  评论(0编辑  收藏  举报