资讯专栏INFORMATION COLUMN

工厂模式 + 单例模式(并发生成单例)

GHOST_349178 / 3361人阅读

摘要:场景一个发送者可以发送邮件或者短信,为日后扩展发送文件功能,可以定义短信工厂和邮件工厂生产发送者,为方便管理,提供一个工厂管理类负责生成工厂实例,其能保证生成的工厂实例唯一。短信工厂邮件工厂

描述:对象的新建统一由工厂创建,避免客户端直接通过构造方法新建实例;对于创建对象的工厂可以可以使其在整个应用中保持唯一的实例,避免过多的垃圾工厂对象。

场景:一个<发送者>可以发送邮件或者短信,为日后扩展发送文件功能,可以定义短信工厂邮件工厂生产<发送者>,为方便管理,提供一个工厂管理类负责生成工厂实例,其能保证生成的工厂实例唯一。

实现:

定义发送者:

</>复制代码

  1. interface Sender {
  2. public void send(String message);
  3. }

实现短信发送者:

</>复制代码

  1. class SmsSender implements Sender {
  2. @Override
  3. public void send(String message) {
  4. System.out.println("发送短信:" + message);
  5. }
  6. }

实现邮件发送者:

</>复制代码

  1. class EmailSender implements Sender {
  2. @Override
  3. public void send(String message) {
  4. System.out.println("发送邮件:" + message);
  5. }
  6. }

定义工厂,专门负责生产发送者:

</>复制代码

  1. interface Factory {
  2. Sender getSender();
  3. }

定义一个具体的短信发送者工厂:

</>复制代码

  1. class SmsFactory implements Factory {
  2. @Override
  3. public Sender getSender() {
  4. return new SmsSender();
  5. }
  6. }

定义一个具体的邮件发送者工厂:

</>复制代码

  1. class EmailFactory implements Factory {
  2. @Override
  3. public Sender getSender() {
  4. return new EmailSender();
  5. }
  6. }

定义一个工厂管理者,负责生成具体的工厂实例;这里特意使用两种方式生成工厂实例,基本保证了并发情况下生成工厂的唯一实例;对于同步的实现,仅有在工厂为空的情况下才存在同步。

</>复制代码

  1. class FactoryManager {
  2. private static class SingletoSmsFactory {
  3. private static Factory instance = new SmsFactory();
  4. private static Factory getInstance() {
  5. return SingletoSmsFactory.instance;
  6. }
  7. }
  8. private static class SingletoEmailFactory {
  9. private static Factory instance = null;
  10. private static synchronized void initInstance() {
  11. if(null == instance) {
  12. instance = new EmailFactory();
  13. }
  14. }
  15. private static Factory getInstance() {
  16. if(null == instance) {
  17. initInstance();
  18. }
  19. return instance;
  20. }
  21. }
  22. public static Factory getFactory(Class clazz) {
  23. String className = clazz.getName();
  24. Factory factory = null;
  25. if(className.equals(SmsFactory.class.getName())) {
  26. factory = SingletoSmsFactory.getInstance();
  27. }
  28. if(className.equals(EmailFactory.class.getName())) {
  29. factory = SingletoEmailFactory.getInstance();
  30. }
  31. return factory;
  32. }
  33. }

客户端调用,循环10次是为了查看多次生成的工厂实例是否唯一。

</>复制代码

  1. public static void main(String[] args) {
  2. for(int i=0; i<10; i++) {
  3. Factory smsFactory = FactoryManager.getFactory(SmsFactory.class);
  4. Sender sender = smsFactory.getSender();
  5. sender.send("hello world!");
  6. System.out.println("短信工厂:" + smsFactory);
  7. Factory emailFactory = FactoryManager.getFactory(EmailFactory.class);
  8. sender = emailFactory.getSender();
  9. sender.send("hello world!");
  10. System.out.println("邮件工厂:" + emailFactory);
  11. }
  12. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64029.html

相关文章

  • 优才公开课笔记:php设计模式(一) 之单例模式

    摘要:最近开展了三次设计模式的公开课,现在来总结一下设计模式在中的应用,这是第一篇创建型模式之单例模式。不过因为不支持多线程所以不需要考虑这个问题了。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 设计模式不...

    guyan0319 评论0 收藏0
  • Java进阶1 —— 对象的创建与销毁

    摘要:构造方法是在对象实例初始化过程中具有举足轻重的地位,并且提供了多种方式来定义构造方法。在中创建对象的开销是相当低的,并且速度很快。对象终结器前面我们讲述的都是构造方法和对象初始化相关的主题,但还未提及他们的反面对象销毁。 原文链接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...

    nemo 评论0 收藏0
  • python之单例模式工厂模式

    摘要:在工厂方法模式中,我们会遇到一个问题,当产品非常多时,继续使用工厂方法模式会产生非常多的工厂类。从简单工厂模式到抽象工厂模式,我们都是在用后一种模式解决前一种模式的缺陷,都是在最大程度降低代码的耦合性。 单例模式 所谓单例模式,也就是说不管什么时候我们要确保只有一个对象实例存在。很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线程池。这些...

    jayce 评论0 收藏0
  • Java基础学习——多线程之单例设计模式(转)

    摘要:总之,选择单例模式就是为了避免不一致状态,避免政出多头。二饿汉式单例饿汉式单例类在类初始化时,已经自行实例化静态工厂方法饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。 概念:  Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。  单例模式有以下特点:  1、单例类只能有一个实例。 ...

    dendoink 评论0 收藏0
  • 来自投资银行的 10 个 Java 面试题

    摘要:本文介绍一些来自投资银行的针对三年以上经验的开发人员面试题。第七题和这两个方法有什么不同答案本题取自我的投资银行针对有经验的开发者的五十个多线程面试题列表。总结以上就是投资银行通常会出的面试题。 原文地址: https://dzone.com/articles/10... 有为数不少的开发者希望能在像 Barclays、Credit Suisse、Citibank 等等那样的投资银行做...

    xbynet 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<