工厂方法(Factory Method)

意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
别名:虚构造器(Virtual Constructor)
结构:
[img]http://dl.iteye.com/upload/attachment/0064/8000/d1face1d-437a-31e3-bdbc-4206c662b966.png[/img]
Product类或接口,定义工厂方法所创建的对象的接口
ConcreteProduct类,实现Product接口
Creator类,声明工厂方法factoryMethod,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,返回一个缺省的ConcreteProduct对象;可以调用工厂方法创建一个Product对象。
ConcreteCreator类,重定义工厂方法以放回一个ConcreteProduct实例。

Creator依赖它的子类来定义工厂方法,要注意不要在Creator的构造器中调用工厂方法,此时在ConcreteCreator中该方法还不可用。

一般实现:

abstract public class Product {
public abstract void operation1();
public abstract void operation2();
}

public class ConcreteProduct extends Product {

@Override
public void operation1() {
System.out.println("ConcreteProduct operation 1");
}

@Override
public void operation2() {
System.out.println("ConcreteProduct operation 2");
}
}

abstract public class Creator {
public Product GetProduct() {
if (product_ == null) {
product_ = CreateProduct();
}
return product_;
}

abstract protected Product CreateProduct();
private Product product_;
}

public class ConcreteCreator extends Creator {

@Override
protected Product CreateProduct() {
return new ConcreteProduct();
}
}

客户端使用
public class Client {
public static void main(String args[]) {
Creator creator = new ConcreteCreator();
Product product = creator.GetProduct();
product.operation1();
product.operation2();
}
}

执行结果:
ConcreteProduct operation 1
ConcreteProduct operation 2


再来看一个例子:
[img]http://dl.iteye.com/upload/attachment/0064/8266/e1d106c7-ecf0-38bd-9a37-ad3fec806ace.png[/img]
图中Application可以是一个文档编辑器(Editor),支持多种格式,如TXT、PDF、DOC等,MyApplication对应具体的文档编辑器(TxtEditor, PdfEditor, DocEditor)。
public interface Document {
public void open();
public void save();
public void close();
public void revert();
}

public class TxtDocument implements Document {
@Override
public void open() {
System.out.println("Text Document open");
}

@Override
public void save() {
System.out.println("Text Document save");
}

@Override
public void close() {
System.out.println("Text Document close");
}

@Override
public void revert() {
System.out.println("Text Document revert");
}
}

public abstract class Editor {
private Document doc;
protected abstract Document createDocument();

public void newDocument() {
doc = createDocument();
doc.open();
}

public void closeDocument() {
doc.close();
}

public void saveDocument() {
doc.save();
}

public void revertDocument() {
doc.revert();
}
}

public class TxtEditor extends Editor {
@Override
protected Document createDocument() {
return new TxtDocument();
}
}

客户端使用:
public class Client {
public static void main(String args[]) {
Editor editor = new TxtEditor();
editor.newDocument();
editor.revertDocument();
editor.saveDocument();
editor.closeDocument();
}
}

执行结果
Text Document open
Text Document revert
Text Document save
Text Document close

在上例中,Client不知道Document类,只通过Editor间接的访问Document,这有点儿想Proxy模式,Editor对Client隐藏了Document类。因此设计模式常结合起来一起使用,具体情况具体分析,不能一概而论。总之设计模式的目的就是要隐藏变化,当变化到来时,做尽量少的修改,遵循开闭原则等面向对象一般原则[url]http://jack-boy.iteye.com/blog/1420629[/url]。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值