工厂方法模式,意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
工厂模式 思想是一个抽象产品类,一个抽象工厂类。一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。
先看抽象产品类
package com.wanq.designmode.factory;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午03:47:49
* @类说明:
* 产品类
*/
public abstract class Product {
// 产品类的公共放方法
public void method1(){
}
// 抽象方法
public abstract void method2();
}
具体产品类
package com.wanq.designmode.factory;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午03:50:21
* @类说明:
* 具体产品类
*/
public class ConcreateProduct1 extends Product {
@Override
public void method2() {
// TODO Auto-generated method stub
// 业务逻辑处理
}
}
抽象工厂类
package com.wanq.designmode.factory;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午03:52:01
* @类说明:
* 抽象工厂类
*/
public abstract class Creator {
/**
* 创建一个产品对象时,其输入参数类型可以自行定义
* @param <T>
* @param c
* @return
*/
public abstract <T extends Product> T creatoProduct(Class<T> c);
}
具体工厂类
package com.wanq.designmode.factory;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午03:54:51
* @类说明:
* 具体工厂类
*/
public class ConcreateCreator extends Creator {
@Override
public <T extends Product> T creatoProduct(Class<T> c) {
// TODO Auto-generated method stub
Product product = null;
try {
product = (Product)Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T)product;
}
}
调用的方法
package com.wanq.designmode.factory;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午03:57:24
* @类说明:
*
*/
public class Client {
public static void main(String[] args){
Creator creator = new ConcreateCreator();
Product product = creator.creatoProduct(ConcreateProduct1.class);
// 处理业务逻辑
product.method2();
}
}
工厂模式 扩展
************************************
1.简单工厂模式 不需要抽象工厂,直接通过简单工厂模式得到产品对象
************************************
简单工厂类
package com.wanq.designmode.factory.simpleFactory;
import com.wanq.designmode.factory.ConcreateProduct1;
import com.wanq.designmode.factory.Product;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午04:25:10
* @类说明:
* 简单工厂类
*/
public class SimpleCreator {
public static <T extends Product> T creatoProduct(Class<T> c){
Product product = null;
try {
product = (Product)Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T)product;
}
}
应用场景
package com.wanq.designmode.factory.simpleFactory;
import com.wanq.designmode.factory.ConcreateProduct1;
import com.wanq.designmode.factory.Product;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午04:29:48
* @类说明:
*
*/
public class Client {
public static void main(String[] args){
Product product = SimpleCreator.creatoProduct(ConcreateProduct1.class);
// 处理业务逻辑
product.method2();
}
}
************************************
2.延迟加载工厂模式 通过该工厂生产的对象,用过后不会立即释放掉,放在缓存中,等待下次使用。
************************************
延迟加载工厂
package com.wanq.designmode.factory.lazyInit;
import java.util.HashMap;
import java.util.Map;
import com.wanq.designmode.factory.ConcreateProduct1;
import com.wanq.designmode.factory.ConcreateProduct2;
import com.wanq.designmode.factory.Product;
/**
* @author-WanQ
* @创建时间:2013-3-24 下午04:36:49
* @类说明:
* 延迟加载的工厂类
*/
public class ProductFactory {
private static final Map<String,Product> proMap = new HashMap<String, Product>();
public static Product createProduct(String type) {
Product product = null;
if(proMap.containsKey(type)){
product = proMap.get(type);
}else{
if(type == "Product1"){
product = new ConcreateProduct1();
}else{
product = new ConcreateProduct2();
}
// 同时把对象放到缓存里
proMap.put(type, product);
}
return product;
}
}