您的位置:首页 > 其它

121 项目 028 笔记向 设计模式 工厂方法模式

2017-03-19 00:00 267 查看

工厂方法模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

类图:



Product
负责定义产品的共性,实现对事件最的最抽象的定义,
Creator
为抽象创建类,也就是抽象工厂,具体的创建由实现工厂
ConcreteCreatetor
完成。

一个通用方式

抽象工厂类:AbstractProductFactory

package com.laolang.dp.factory;

public abstract class AbstractProductFactory {
/**
* 创建一个产品对象
* @param t 创建参数
* @param <T> 创建的产品
* @return
*/
public abstract <T extends AbstractProduct> T createProduct ( Class<T> t );
}

工厂实现类:ProductFactory

package com.laolang.dp.factory;

public class ProductFactory extends AbstractProductFactory {
@Override
public <T extends AbstractProduct> T createProduct(Class<T> t) {
AbstractProduct product = null;
try {
product = (AbstractProduct) Class.forName(t.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return (T)product;
}
}

抽象产品类:AbstractProduct

package com.laolang.dp.factory;

public abstract  class AbstractProduct {

// 产品类的公共方法
public void methodOne(){}

// 抽象方法
public abstract void methodTwo();

}

产品实现类:ConcreteProductOne

package com.laolang.dp.factory;

public class ConcreteProductOne extends  AbstractProduct{
@Override
public void methodTwo() {
System.out.println("产品一");
}
}

使用

package com.laolang.dp.factory;

import org.junit.Test;

public class FactoryTest {

@Test
public void testOne(){
ProductFactory productFactory = new ProductFactory();
ConcreteProductOne productOne = productFactory.createProduct(ConcreteProductOne.class);
ConcreteProductTwo productTwo = productFactory.createProduct(ConcreteProductTwo.class);

}
}

优点

良好的封装性

良好的扩展性

屏蔽产品类的具体实现

解耦

使用场景

客户端不知道它要创建的具体是哪一个子类。

一个类想要由自己的子类来定义某对象的创建过程。

类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。

最佳实践

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