设计模式 -- 工厂模式

栏目: 后端 · 发布时间: 6年前

内容简介:使用一个统一的工厂类,以鼠标为例子,有戴尔鼠标,有惠普鼠标是对一些业务代码的简单优化(简单不一定就不好)工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口

使用一个统一的工厂类,以鼠标为例子,有戴尔鼠标,有惠普鼠标

设计模式 -- 工厂模式
public class MouseFactory {
          public static final String TAG = "MouseFactory";
          public static Mouse getMouse(String type) {
              Mouse mouse = null;
              if (type.equalsIgnoreCase("dell")) {
                  mouse = new DellMouse();
              } else if (type.equalsIgnoreCase("hp")) {
                  mouse = new HpMouse();
              } 
              return mouse;
          }
   }
复制代码

优点

是对一些业务代码的简单优化(简单不一定就不好)

缺点

  • 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
  • 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
  • static 静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构

工厂方法模式(最常用)

工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口

设计模式 -- 工厂模式

写法

工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。

戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。

生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。

设计模式 -- 工厂模式

产品的公共接口

public interface Mouse {
    void move();
}
复制代码

具体实现类

public class DellMouse implements Mouse {
    @Override
    public void move() {
        System.out.print("dell move");
    }
}
public class HpMouse implements Mouse {
    @Override
    public void move() {
        System.out.print("hp move");
    }
}
复制代码

抽象的工厂接口MouseFactory

public interface MouseFactory {
    Mouse getMouse();
}
复制代码

具体工厂

public class DellMouseFactory implements MouseFactory {
    @Override
    public Mouse getMouse() {
        return new DellMouse();
    }
}

public class HpMouseFactory implements MouseFactory {
    @Override
    public Mouse getMouse() {
        return new HpMouse();
    }
}
复制代码

使用

// 戴尔鼠标
MouseFactory factory=new DellMouseFactory();
Mouse  mouse=factory.getMouse();
mouse.move();
// 惠普鼠标
MouseFactory factory=new HpMouseFactory();
Mouse  mouse=factory.getMouse();
mouse.move();
复制代码

优点

  • 更符合开-闭原则 新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
  • 符合单一职责原则 每个具体工厂类只负责创建对应的产品

缺点

  • 一个具体工厂只能创建一种具体产品
  • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加 如果没有更复杂的需要,工厂方法模式就够了.

抽象工厂模式

一个工厂往往需要生产多类产品

值得注意的是,这时的工厂就不仅仅是鼠标工厂那种单一的概念了,它是更多的是一种"平台",比如linux/win, 或者品牌,华硕/戴尔/惠普工厂.

写法

抽象工厂模式也就是不仅生产鼠标,同时生产键盘。

也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。

戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。

创建工厂时,由戴尔工厂创建。

后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。

设计模式 -- 工厂模式

这里的代码不继续给了,只是在抽象的工厂接口中,定义多个产品.

在抽象工厂模式中,假设我们需要增加一个工厂

假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。

之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。

设计模式 -- 工厂模式

在抽象工厂模式中,假设我们需要增加一个产品

假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。

之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 以上。

设计模式 -- 工厂模式

优点

其实是对于产品族(多种产品由于业务原因有内在聚合性,比如都是戴尔家的)情况下,工厂方法模式的拓展.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learn Python the Hard Way

Learn Python the Hard Way

Zed A. Shaw / Addison-Wesley Professional / 2013-10-11 / USD 39.99

Master Python and become a programmer-even if you never thought you could! This breakthrough book and CD can help practically anyone get started in programming. It's called "The Hard Way," but it's re......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具