`
jack_boy
  • 浏览: 138371 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工厂方法(Factory Method)

阅读更多
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
别名:虚构造器(Virtual Constructor)
结构:

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


再来看一个例子:

图中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类。因此设计模式常结合起来一起使用,具体情况具体分析,不能一概而论。总之设计模式的目的就是要隐藏变化,当变化到来时,做尽量少的修改,遵循开闭原则等面向对象一般原则http://jack-boy.iteye.com/blog/1420629
  • 大小: 38.4 KB
  • 大小: 60.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics