`
iamxi
  • 浏览: 191796 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

原型工厂模式

阅读更多

    顾名思义就是原型模式和工厂模式的结合。在GOF的书里面,抽象工厂那节中对这个有描述,不过内容很少,所以看的时候也没注意到。

    说个实际的问题:系统需要向用户发送短信,但是根据场景的不同,发送的短信格式也不同,比如重置密码和发送临时验证码的短信格式就有区别,而之前的开发人员使用了策略模式,每个内容都有一个类,现在也不方便去改动这些。但是随需求的增加,发送的场景在不断增加,策略+工厂方法模式的情况下需要去增加更多的if-else,导致扩展困难,也使得调用时候不直观。

    本人自认为自己小脑瓜没有能力想出好办法,只好去翻下书籍,无意中看到了抽象工厂内介绍原型工厂的内容,想着可以借鉴。如果依靠一定规范的传入参数,通过if-else来判断需要使用的算法闲代码忒长,那么不为什么不直接传入算法呢。当然传入算法的类的话太费资源,但是传个Class或Class Name不适问题。

参数就是用枚举,这比String参数好,原因是String可以传入任何字符串,而枚举只能是枚举内的指定值,枚举代码如下:

public enum MessageBuilderEnum {

	RESET_PASSWORD_SMS(ResetPwSmsMsgSendServiceImpl.class),
	RESET_PASSWORD_EMAIL(ResetPwMailMsgSendServiceImpl.class),
	SMS_FEE(SmsFeeMsgSendServiceImpl.class),
	TEMP_CODE_SMS(TempCodeSmsMsgSendServiceImpl.class),
	UNIVERSAL_SMS(BoundMsgSendServiceImpl.class);
	
	private Class<?> builderClass;
	
	MessageBuilderEnum(Class<?> builderClass) {
		this.builderClass = builderClass;
	}
	
	public Class<?> getBuidlerClass() {
		return builderClass;
	}
}

 再看下功能实现的代码

	private static ConcurrentHashMap<String, AbstractMsgSendServiceImpl> messageBuilder = new ConcurrentHashMap<String, AbstractMsgSendServiceImpl>();

	public MessageSendServiceImpl() {
		for (MessageBuilderEnum builderClass : MessageBuilderEnum.values()) {
			try {
				messageBuilder.put(builderClass.getBuidlerClass().getSimpleName(),
						(AbstractMsgSendServiceImpl) builderClass.getBuidlerClass().newInstance());
			} catch (InstantiationException e) {
				logger.error(e.getMessage(), e);
			} catch (IllegalAccessException e) {
				logger.error(e.getMessage(), e);
			}
		}
	}

	@Override
	public String send(ServMessage message, MessageBuilderEnum builderEnum) {
		AbstractMsgSendServiceImpl builder = messageBuilder
				.get(builderEnum.getBuidlerClass().getSimpleName()).clone();
		if (builder != null) {
			return builder.send(message);
		} else {
			return null;
		}
	}

 工厂方法是在构造函数下,在初始化的时候就为枚举下所有的类初始化,然后保存在Map下,用于当作原型。在需要使用的时候再对原型clone一下就是了。

    其实可以在需要使用时候初始化。这里使用原型是听说原型创建新对象比较快,当然本人没仔细测试过,有时间再研究。

    原型工厂的工厂可以是抽象工厂模式,也可以是工厂方法模式

分享到:
评论

相关推荐

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子...

    day02 工厂模式+原型模式+建造者模式

    设计模式之工厂模式、原型模式和建造者模式 设计模式是一种软件设计的解决方案,能够使我们的代码更加灵活、可维护和可扩展。今天,我们将讨论三种设计模式:工厂模式、原型模式和建造者模式。 工厂模式 工厂模式...

    原型模式PPT文档

    5. **与其他模式的结合**:原型模式可以和工厂模式结合使用,工厂模式负责创建原型对象,而原型模式则负责克隆这些对象,提供更灵活的扩展。 6. **示例代码**:PPT可能还包含了Java或其他语言的示例代码,展示如何...

    iOS设计模式之原型模式

    我们可以创建一个原型工厂,负责管理各种类型的原型对象,并根据需求返回对应的副本。这样,不仅可以简化对象的创建过程,还能提供一个集中管理对象的地方,便于后期维护和扩展。 此外,原型模式在处理深拷贝和浅...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在需要大量相似...在实际开发中,原型模式可以与其他设计模式(如工厂模式)结合使用,以提供更灵活的对象创建策略。

    JAVA设计模式、工厂模式、原型模式等

    《Java设计模式》面向有一定Java语言基础和一定编程经验的读者,重点探讨在Java程序设计中怎样使用著名的23个设计模式。《Java设计模式》的目的是让读者不仅学习怎样在软件设计中使用好设计模式,更重要的是让读者...

    实验六:原型模式.rar

    原型模式经常与其他设计模式结合使用,如工厂模式,可以配合创建对象,简化对象创建过程;单例模式中,有时也会用到原型模式来创建单例的副本。 总的来说,实验六“原型模式”是一个很好的学习和实践设计模式的...

    前端设计模式大全,包括工厂模式,原型模式,构造器模式等

    本资料集包含了多种重要的前端设计模式,如工厂模式、原型模式和构造器模式,下面将详细阐述这些模式的核心概念和应用。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象出...

    iOS设计模式-原型设计模式

    此外,原型设计模式还可以与其他设计模式结合使用,如策略模式或工厂模式。例如,你可以使用原型模式创建一个基础视图组件,然后根据业务逻辑或用户选择动态地决定使用哪种具体类型的视图,这将增加代码的灵活性和可...

    原型模式源代码

    在实际应用中,原型模式可以与其他设计模式结合使用,如工厂模式,提供更灵活的对象创建策略。 文件`原型模式UML图.vsd`应该是该原型模式的统一建模语言(UML)图,它可视化地展示了类与类之间的关系,包括原型类和...

    原型模式代码示例

    原型模式是一种设计模式,属于创建型模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来创建。这种模式在系统中需要频繁创建相似对象时特别有用,可以提高性能并降低复杂性。在Java中,我们可以...

    原型模式示例

    原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以被克隆以创建新...在实际开发中,原型模式常常与其他设计模式(如工厂模式)结合使用,以提供更加灵活和高效的解决方案。

    [创建型模式]设计模之原型模式(Prototype Pattern)

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数或工厂方法。这种模式的核心在于,它提供了一种更高效、更灵活的方式来创建新实例,特别是在...

    js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式).docx

    本文将详细介绍三种常见的对象创建方法:工厂模式、构造函数模式以及原型模式,并探讨它们各自的优缺点。 #### 工厂模式 工厂模式是一种常见的设计模式,用于抽象出创建对象的具体过程。在 JavaScript 中,可以...

    装饰器模式、原型模式、享元模式

    装饰器模式、原型模式和享元模式是软件设计模式中的三种重要模式,它们在实际项目开发中被广泛应用,以提高系统的性能和可维护性。下面将详细解释这三种设计模式的概念、应用场景及其实现方式。 **装饰器模式...

    JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    本文将深入探讨JavaScript中的面向对象基础,包括工厂模式、构造函数模式、原型模式、混合模式和动态原型模式。 工厂模式是一种简单但有效的方式,用于创建对象,尤其是当我们需要创建具有相同结构但可能具有不同值...

    C#23种设计模式样例代码和UML图

    创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 中介者模式、 访问者模式、 状态...

Global site tag (gtag.js) - Google Analytics