博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
121 项目 028 笔记向 设计模式 工厂方法模式
阅读量:6092 次
发布时间:2019-06-20

本文共 1980 字,大约阅读时间需要 6 分钟。

hot3.png

工厂方法模式定义

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

类图:

输入图片说明

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

一个通用方式

抽象工厂类:AbstractProductFactory

package com.laolang.dp.factory;public abstract class AbstractProductFactory {    /**     * 创建一个产品对象     * @param t 创建参数     * @param 
创建的产品 * @return */ public abstract
T createProduct ( Class
t );}

工厂实现类:ProductFactory

package com.laolang.dp.factory;public class ProductFactory extends AbstractProductFactory {    @Override    public 
T createProduct(Class
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);    }}

优点

  1. 良好的封装性

  2. 良好的扩展性

  3. 屏蔽产品类的具体实现

  4. 解耦

使用场景

  • 客户端不知道它要创建的具体是哪一个子类。
  • 一个类想要由自己的子类来定义某对象的创建过程。
  • 类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。

最佳实践

熟能生巧

转载于:https://my.oschina.net/iamhere/blog/862093

你可能感兴趣的文章
Flutter main future mirotask 的执行顺序
查看>>
切片方式倒序字符串
查看>>
jQuery源码解析之jQuery.event.dispatch()
查看>>
HTTP Header 详解
查看>>
延时提示框 setTimeout
查看>>
jquery之选择器
查看>>
微信网页授权获取用户基本信息
查看>>
如何添加在eclipse 中添加 window Builder
查看>>
页面刷新两次为什么取不到值
查看>>
docker gitlab
查看>>
jdk环境变量配置
查看>>
Hibernate写配置文件无提示信息解决
查看>>
iOS和android游戏纹理优化和内存优化(cocos2d-x)
查看>>
前端工程构建总结
查看>>
Scrum立会报告+燃尽图(十月十八日总第九次):功能细化与数据库设计
查看>>
C#socket通信
查看>>
浏览器版本信息判断整理
查看>>
CSS之Position详解
查看>>
【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!
查看>>
Ubuntu12.10下Python(cx_Oracle)访问Oracle解决方案
查看>>