• Java设计模式系列2--工厂方法模式(Factory Method)


    2014-02-26 09:56:45

    声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢!

    工厂方法模式分为三种:

    1. 普通工厂模式

    建立一个工厂类,对实现了同一接口的一些类进行实例的创建,如下图:

    代码示例如下:

     1 public interface Sender {
     2     public void send();
     3 }
     4 
     5 class MailSender implements Sender {
     6 
     7     @Override
     8     public void send() {
     9         System.out.println("This is MailSender!");
    10     }
    11 }
    12 
    13 class SmsSender implements Sender {
    14 
    15     @Override
    16     public void send() {
    17         System.out.println("This is SmsSender!");
    18     }
    19 }
    20 
    21 class SendFactory {
    22     public Sender produce(String type) {
    23         if ("mail".equals(type)) {
    24             return new MailSender();
    25         } else if ("sms".equals(type)) {
    26             return new SmsSender();
    27         } else {
    28             System.out.println("请输入正确的类型!");
    29             return null;
    30         }
    31     }
    32 }

    2. 多个工厂方法模式

    是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:

    代码示例如下:

     1 public interface Sender {
     2     public void send();
     3 }
     4 
     5 class MailSender implements Sender {
     6 
     7     @Override
     8     public void send() {
     9         System.out.println("This is MailSender!");
    10     }
    11 }
    12 
    13 class SmsSender implements Sender {
    14 
    15     @Override
    16     public void send() {
    17         System.out.println("This is SmsSender!");
    18     }
    19 }
    20 
    21 class SendFactory {
    22 
    23     public Sender produceMail() {
    24         return new MailSender();
    25     }
    26 
    27     public Sender produceSms() {
    28         return new SmsSender();
    29     }
    30 }

    3. 静态工厂方法模式

    将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

    代码示例如下:

     1 public interface Sender {
     2     public void send();
     3 }
     4 
     5 class MailSender implements Sender {
     6 
     7     @Override
     8     public void send() {
     9         System.out.println("This is MailSender!");
    10     }
    11 }
    12 
    13 class SmsSender implements Sender {
    14 
    15     @Override
    16     public void send() {
    17         System.out.println("This is SmsSender!");
    18     }
    19 }
    20 
    21 class SendFactory {
    22 
    23     public static Sender produceMail() {
    24         return new MailSender();
    25     }
    26 
    27     public static Sender produceSms() {
    28         return new SmsSender();
    29     }
    30 }

    总体来说,凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

  • 相关阅读:
    WMS学习笔记:1.尝试加载WMS
    ftp文件上传和下载
    [WorldWind学习]19.WebDownload
    ASP.NET C# 如何在程序中控制IIS服务或应用程序池重启?
    asp.net mvc 全局权限过滤器及继成权限方法
    使用ActionFilterAttribute 记录 WebApi Action 请求和返回结果记录
    单点登录系统功能调试界面
    asp.net 读取RedisSessionStateProvider配置
    Redis-benchmark测试Redis性能
    ASP.NET MVC中移除冗余Response Header
  • 原文地址:https://www.cnblogs.com/wlrhnh/p/3568509.html
Copyright © 2020-2023  润新知