您的位置:首页 > 其它

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

2013-07-17 09:17 716 查看


概括

名称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 是什么样的。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: