博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 —— 工厂模式
阅读量:5749 次
发布时间:2019-06-18

本文共 3035 字,大约阅读时间需要 10 分钟。

简介

工厂模式(Factory Pattern)专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。

简单工厂模式

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂并不属于23种设计模式。

实例

肥宅喜爱的各种快乐水(意指本人) 快乐水(产品接口)

public interface Kls {    String name();}复制代码

肥宅快乐水-可乐(具体产品)

public class Coke implements Kls {    @Override    public String name() {        return "肥宅快乐水-可乐";    }}复制代码

快乐水-雪碧(具体产品)

public class Sprite implements Kls {    @Override    public String name() {        return "快乐水-雪碧";    }}复制代码

快乐水工厂(工厂类)

public class KlsFactory {    public static Kls getFzs(String type) throws Exception {        Kls fzs = null;        if ("coke".equalsIgnoreCase(type)) {            fzs = new Coke();        } else if ("sprite".equalsIgnoreCase(type)) {            fzs = new Sprite();        }        if (Objects.isNull(fzs)) {            throw new RuntimeException("没找到快乐水~");        }        return fzs;    }}复制代码

肥宅(客户)

public class Fz {    @Test    public void drink() throws Exception {        // 制造可乐        Kls coke = KlsFactory.getFzs("coke");        System.out.println("肥宅开始喝:" + coke.name());        // 制造雪碧        Kls sprite = KlsFactory.getFzs("sprite");        System.out.println("肥宅开始喝:" + sprite.name());    }}复制代码

UML类图

优点:

  1. 隐藏了具体实现:像 CokeSprite,这样的产品,客户端是不需要知道具体实现的,只需知道怎么用;

  2. 客户端只需直接使用对象就好,不需关心对象是怎么 new 出来的;

  3. 接耦:客户端没有 new xxx 这样的硬编码,后期设计者改变框架,各种类(除了工厂类)都有改变,只要工厂类的名字、方法名字没变,客户端的代码,一行都不要动。

缺点:

  1. 扩展麻烦,需要改动现有代码。如果想要增加一个新的产品类,就需要改动工厂类代码。
  2. 所有逻辑全放在工厂类,产品一多将变得异常难阅读,一旦出错,就全GG了。

工厂方法模式

工厂方法模式(Factory Method)是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。

实例

接着上面快乐水的例子。将 快乐水工厂 (KlsFactory 抽象出共有方法,再分别实现具体的快乐水生产工厂。

快乐水总工厂

public interface Factory {    /**     * 制造快乐水     *     * @return Kls     */    Kls create();}复制代码

可乐工厂

public class CokeFactory implements Factory {    @Override    public Kls create() {        return new Coke();    }}复制代码

雪碧工厂

public class SpriteFactory implements Factory {    @Override    public Kls create() {        return new Sprite();    }}复制代码

肥宅

public class Fz {    @Test    public void drink() throws Exception {        // 制造可乐        CokeFactory cokeFactory = new CokeFactory();        Kls coke = cokeFactory.create();        System.out.println("肥宅开始喝:" + coke.name());        // 制造雪碧        SpriteFactory spriteFactory = new SpriteFactory();        Kls sprite = spriteFactory.create();        System.out.println("肥宅开始喝:" + sprite.name());    }}复制代码

扩展芬达快乐水 芬达快乐水

public class Fanta implements Kls {    @Override    public String name() {        return "快乐水-芬达";    }}复制代码

芬达工厂

public class FantaFactory implements Factory {    @Override    public Kls create() {        return new Fanta();    }}复制代码

肥宅添加

FantaFactory fantaFactory = new FantaFactory();Kls fanta = fantaFactory.create();System.out.println("肥宅开始喝:" + fanta.name());复制代码

UML类图

优点:

  1. 简单工厂模式 的有点全部保留;
  2. 新增产品,不需要改动现有的代码,只需实现对应的 产品类工厂实现类

缺点:

  1. 增加系统负担;

  2. 当新增产品较多时,会导致代码量剧增;

  3. 一个工厂只能生产一个产品。

转载于:https://juejin.im/post/5c6e8240f265da2da8357243

你可能感兴趣的文章
Fedora9常用网络调试
查看>>
使用cgroups来控制内存使用
查看>>
kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载
查看>>
Unable to Open User Login File
查看>>
Qt 静态编译后的exe太大, 可以这样压缩.
查看>>
TortoiseGit学习系列之Windows上本地代码如何通过TortoiserGit提交到GitHub详解(图文)...
查看>>
爆笑:IT人士群聚喝酒的讲究
查看>>
Python案例之QQ空间自动登录程序实现
查看>>
Java IO:同步、非堵塞式IO(NIO)
查看>>
[JMX一步步来] 4、动态MBean:DynamicMBean
查看>>
WF4.0实战(十九):Silverlight+WCF+WF+Linq结合的一个示例
查看>>
5.3. Spring Data JPA
查看>>
【设计模式】—— 桥接模式Bridge
查看>>
MongoDB学习笔记~批量插入方法的实现
查看>>
EF架构~FluentValidation实体检验与实体分离了
查看>>
Asp.Net SignalR - 准备工作
查看>>
[Erlang 0049] 哈哈,一起来打印三角形
查看>>
[Erlang 0053] fun & Code replacement
查看>>
Linux C single linked for any data type
查看>>
WebGIS中矢量切图的初步研究
查看>>