• Java设计模式系列3--抽象工厂模式(Abstract Factory Method)


    2014-02-26 10:55:47

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

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。

    代码示例:

    Sender接口以及实现类

     1 package com.david.factory;
     2 
     3 public interface Sender {
     4     public void send();
     5 }
     6 
     7 class MailSender implements Sender {
     8 
     9     @Override
    10     public void send() {
    11         System.out.println("This is MailSender!");
    12     }
    13 }
    14 
    15 class SmsSender implements Sender {
    16 
    17     @Override
    18     public void send() {
    19         System.out.println("This is SmsSender!");
    20     }
    21 }

    Provider接口及实现类

     1 package com.david.factory;
     2 
     3 public interface Provider {
     4     public Sender produce();
     5 }
     6 
     7 class MailSenderFactory implements Provider {
     8 
     9     @Override
    10     public Sender produce() {
    11         return new MailSender();
    12     }
    13 
    14 }
    15 
    16 class SmsSenderFactory implements Provider {
    17 
    18     @Override
    19     public Sender produce() {
    20         return new SmsSender();
    21     }
    22 
    23 }

    主程序:

    1 package com.david.factory;
    2 
    3 public class MainTest {
    4     public static void main(String[] args) {
    5         Provider pro = new SmsSenderFactory();
    6         SmsSender sender = (SmsSender) pro.produce();
    7         sender.send();
    8     }
    9 }

    其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!

  • 相关阅读:
    DAX:表值函数 VALUES、DISTINCT和FILTERS
    银行笔试
    修改启动时候的参数 VM options 需要 先加上 D
    MAC系统下jmeter安装教程
    mac 安装 开发环境
    如何在Mac中卸载openjdk15
    技术管理进阶——技术Leader如何拒绝业务方?
    mysql GROUP_CONCAT 顺序排序
    MySQL DATE_FORMAT函数:格式化指定的日期
    java万年历、24节气算法java算法实现
  • 原文地址:https://www.cnblogs.com/wlrhnh/p/3568744.html
Copyright © 2020-2023  润新知