zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    IEnumerable、ICollection、IList、List关系和区别
    在Winform界面中使用DevExpress的TreeList实现节点过滤查询的两种方式
    关键字Lock的简单小例子
    .NET Core DI简单介绍
    Linux服务器部署.Net Core笔记:六、安装MySQL
    表的透视变换
    ZedGraph怎样在生成曲线时随机生成不一样的颜色
    3、手写Unity容器--第N层依赖注入
    微信支付-小程序H5 公众号 Payment SDK
    WPF继续响应被标记为已处理事件的方法
  • 原文地址:https://www.cnblogs.com/wlrhnh/p/3568509.html
Copyright © 2011-2022 走看看