您的位置:首页 > 编程语言 > Java开发

Java设计模式(2) -- 工厂方法

2009-08-17 21:00 555 查看
Factory Method

英文简单描述

Intent

Define an interface for creating an object, but let subclasses decide which class to instantiate.

Factory methods eliminate the need to bind application-specific classes into your code.The code only deals with interfaces; therefore it can work with any user-defined classes that implement the right interface.

How to

Product

defines the interface of objects the factory method creates.

ConcreteProduct

implements the Product interface.

Creator

declares the factory method, which returns an object of type Product.

ConcreteCreator

overrides the factory method to return an instance of a ConcreteProduct.

Known Cases

Used in Abstract Factory

Document Application

UML






工厂方法有三种变体:

(1)并行的类层次结构

public class Creator {
public Product createProduct() { // factory method
// default implement
return new Product();
}
}
public class ConcreteCreator extends Creator {
public Product createProduct() {
return new ConcreteProduct();
}
}
public class Product {
public void doSomething() {
System.out.println("Default Implement");
}
}
public class ConcreteProduct extends Product {
public void doSomething() {
System.out.println("Concrete Implement");
}
}
public class TestFactoryMethod {
public static void main(String args[]) {
//根据不同条件,初始化不同的Creator
Creator creator = new ConcreteCreator();
Product product = creator.createProduct();
product.doSomething();
}
}



(2)根据类型id,创建不同子类对象

public interface IDBConnector {
Connection createConnection(Map params);
}
public class MysqlConnector implements IDBConnector {
public Connection createConnection(Map params) {
System.out.println("Create Mysql Connection");
return null;
}
}
ublic class OracleConnector implements IDBConnector {
public Connection createConnection(Map params) {
System.out.println("Create Mysql Connection");
return null;
}
}
public class DBConnectorCreator {
public final static String MYSQL = "mysql";
public final static String ORACLE = "oracle";
private static DBConnectorCreator instance = new DBConnectorCreator();
public static DBConnectorCreator getInstance() {
return instance;
}
private DBConnectorCreator() {}
public IDBConnector createDBConnector(String type) {
IDBConnector connector = null;
if (type.equals(MYSQL)) {
connector = new MysqlConnector();
} else if (type.equals(ORACLE)) {
connector = new OracleConnector();
} else {
throw new RuntimeException("Unsupport type");
}
return connector;
}



(3)利用泛型来去除Creator子类

public class GenericCreator {
public Product createProduct(Class<? extends Product> type) {
Product product = null;
try {
product = type.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return product;
}
}
class TestGeneric {
public static void main(String[] args) {
GenericCreator creator = new GenericCreator();
Product product = creator.createProduct(ConcreteProduct.class);
product.doSomething();
}
}


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