顾名思义就是原型模式和工厂模式的结合。在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种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子...
《Java设计模式》面向有一定Java语言基础和一定编程经验的读者,重点探讨在Java程序设计中怎样使用著名的23个设计模式。《Java设计模式》的目的是让读者不仅学习怎样在软件设计中使用好设计模式,更重要的是让读者...
day02 工厂模式+原型模式+建造者模式
前端设计模式大全,包括工厂模式,原型模式,构造器模式等
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式).docx
创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 中介者模式、 访问者模式、 状态...
主要介绍了面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式,需要的朋友可以参考下
原型模式用来解决对象的创建问题,它是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的对象 工厂模式将目的将创建对象的具体过程屏蔽隔离起来、解耦:将对象的创建和使用的过程...
主要介绍了JS中创建自定义类型的常用模式,结合实例形式总结分析了工厂模式,构造函数模式,原型模式,动态原型模式等javascript创建自定义类型的常用模式与相关操作注意事项,需要的朋友可以参考下
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式).docx
在js中,创建对象的方式有工厂模式和构造函数模式等; 而构造函数模式最大的问题在于:构造函数中的每个方法都需要在实例对象中重新创建一遍,不能复用,所以为了解决这一个问题,就需要使用原型模式来创建对象。 ...
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、...
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考《面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式》,接下来讲一般通过那些方法完成...
设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...