意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,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中该方法还不可用。
一般实现:
客户端使用
执行结果:
再来看一个例子:
[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)。
客户端使用:
执行结果
在上例中,Client不知道Document类,只通过Editor间接的访问Document,这有点儿想Proxy模式,Editor对Client隐藏了Document类。因此设计模式常结合起来一起使用,具体情况具体分析,不能一概而论。总之设计模式的目的就是要隐藏变化,当变化到来时,做尽量少的修改,遵循开闭原则等面向对象一般原则[url]http://jack-boy.iteye.com/blog/1420629[/url]。
别名:虚构造器(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]。