首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

工场方法-Factory Method

2012-08-21 
工厂方法-Factory Method0.前言本文主要面向初学者,网上这方面的文章也很多,之所以还写这个,一方面是给有

工厂方法-Factory Method

0.前言

本文主要面向初学者,网上这方面的文章也很多,之所以还写这个,一方面是给有需要的人,另一方面是巩固自己的知识,写写记得更牢嘛,也为去找实习找工作打点基础。这主要是从我的角度去理解工厂方法,肯定有很多不够好的地方,如果大牛们不吝啬,欢迎批评指正。

?

1.正文

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

?

考虑这样一个小例子,可能不太靠谱,凑合着用吧。

你是做手机代工的,你可以做iphone的手机,也可以做android的手机等,需求是变的,这个不确定。做不同的手机用到的配件等是不一样的,但最后的手机质量检测程序是一样的,那该怎么办呢?

?

这时候工厂方法给你提供了一个解决方案,首先把你的工厂定义为一个抽象的类,有一个抽象方法专门负责生产手机,然后让子类来负责生产相应的手机,最后手机的质量检测由你来执行。这样你就不用关心是生产哪种手机和怎样生产的,你知道只要继承了你的工厂,给你返回手机就行了,让手机的生产给子类去做。类似的,生产的产品也是一样的,对不同的产品,可以定义一个抽象的类,让不同的产品也继承这个抽象的产品。这就是工厂方法。

?

UML图

?

工场方法-Factory Method

?

这里定义了两个抽象类,Product和Creator,Creator的子类ConcreteCreator重定义了抽象操作,负责具体的创建工作。根据创建的产品的不同,可以有多个具体的产品和多个具体的工厂,只需要继承相应的类就行,两个抽象类无需改变。

?

适用性:

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

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

?

上面例子简单实现的代码

一个5个类,抽象产品Product和抽象工厂Creator在同一包中,具体产品类IphoneProduct和具体工厂类IphoneCreator分别继承Product、Creator,跟抽象类属于不同包,IphoneCreator负责具体产品Iphone的生产。Client属于测试类。

?

?

抽象产品类Product

package com.rdc.dp.frameword;public abstract class Product {//这里只定义一个简单方法public abstract void use();}

?

?

抽象工厂类Creator

?

package com.rdc.dp.frameword;public abstract class Creator {public final Product newProduct() {Product product = createProduct();check(product);return product;}//手机检测private Product check(Product product) {//do somethingreturn product;}//子类实现此方法,负责具体产品的创建protected abstract Product createProduct();}

?

?newProduct()方法供客户端调用,负责手机生产和手机质量检测,而手机生产的方法为抽象方法createProduct(), 是由具体子类去实现的。

?

?

具体产品类IphoneProduct

?

package com.rdc.dp;import com.rdc.dp.frameword.Product;public class IphoneProduct extends Product {@Overridepublic void use() {System.out.println("Iphone生产出来啦,这是你的Iphone.");}}

?

?

具体工厂类,负责生产Iphone,IphoneCreator

?

package com.rdc.dp;import com.rdc.dp.frameword.Creator;import com.rdc.dp.frameword.Product;public class IphoneCreator extends Creator{/** *生成Iphone的工厂,负责产品的具体创建 */@Overrideprotected Product createProduct() {return new IphoneProduct();}}

?

?

测试类Client

?

import com.rdc.dp.IphoneCreator;import com.rdc.dp.frameword.Creator;import com.rdc.dp.frameword.Product;public class Client {public static void main(String[] args) {//建一个Iphone工厂Creator creator = new IphoneCreator();//产品由具体类生产Product product = creator.newProduct();product.use();}}

测试结果:Iphone生产出来啦,这是你的Iphone.

?

这样,我们就实现了一个简单的工厂方法。我们可以看到,在客户程序中,可以有效地避免了具体产品对象和应用程序之间的耦合。另外,当你要生产其它的产品时,比如android手机,只需用定义相应的android产品和生产android产品的工厂类,而两个抽象类不需要做任何修改。

热点排行