设计模式 (2) ——工厂方法模式 <IT小鸟每日一遍>

来源:互联网 发布:今天淘宝怎么用不了了 编辑:程序博客网 时间:2024/05/16 15:47

工厂方法模式意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。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 {@Overridepublic 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 {@Overridepublic <T extends Product> T creatoProduct(Class<T> c) {// TODO Auto-generated method stubProduct product = null;try {product = (Product)Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.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;}}


原创粉丝点击