设计模式 —— 工厂模式

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

内容简介:工厂模式(Factory Pattern)专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。简单工厂模式(Simple Factory Pattern):又称为肥宅喜爱的各种快乐水(意指本人) 快乐水(产品接口)

工厂模式(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. 一个工厂只能生产一个产品。


以上所述就是小编给大家介绍的《设计模式 —— 工厂模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Web标准和SEO应用实践

Web标准和SEO应用实践

Aarron Walter / 李清 / 机械工业出版社 / 2008 / 36.00元

本书是关于搜索引擎优化和易发现性的技术指南。. 本书介绍Web标准、可访问性以及Ajax、API、Flash和微格式等内容,包括标记策略、服务器端策略、内容策略、建构易发现的博客、在网站内添加搜索、防止易发现性障碍、用邮件列表挽回流量、将易发现性付诸实践。 本书适合网站开发者与SEO技术业余爱好者等参考。 这不是为营销专家写的一本SEO的书。 针对那些想要找到网站的目标用户......一起来看看 《Web标准和SEO应用实践》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具