设计范式之工厂模式

工厂模式

什么是工厂模式

首先我们需要了解的是什么是工厂模式,顾名思义工厂模式,那肯定和工厂相关呀!首先,我们需要明白的是,一个工厂有很多的分类,就比如说,这个负责这个,那个负责那个,分工明确。

而在Java中的工厂模式中,它的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式:

定义:

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。

说明:

在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。

简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。

简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。

优点和缺点:

优点:

  1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
  2. 客户端无需知道所创建具体产品的类名,只需知道参数即可。
  3. 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。

缺点:

  1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
  2. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
  3. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
  4. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。

代码

//简单工厂模式
    public static void main(String[] args) {
        SimpleFactory sf = new SimpleFactory();
        sf.makeProduct(1).show();//调用的时候注意,注意方法名称,要显示出来最后还要加一个show
    }
    //抽象产品
    public interface Product {
        void show();
    }
    //具体产品:ProductA
    static class ConcreteProduct1 implements Product {
        public void show() {
            System.out.println("具体产品1显示...");
        }
    }
    //具体产品:ProductB
    static class ConcreteProduct2 implements Product {
        public void show() {
            System.out.println("具体产品2显示...");
        }
    }
    static class ConcreteProduct3 implements Product {
        public void show() {
            System.out.println("具体产品3显示...");
        }
    }
    final class Const {
        static final int PRODUCT_A = 0;
        static final int PRODUCT_B = 1;
        static final int PBODUCT_C = 2;
    }
    static class SimpleFactory {
        public static Product makeProduct(int kind) {
            switch (kind) {
                case Const.PRODUCT_A:
                    return new ConcreteProduct1();
                case Const.PRODUCT_B:
                    return new ConcreteProduct2();
                case Const.PBODUCT_C:
                    return new ConcreteProduct3();
            }
            return null;
        }
    }

简单工厂模式的主要角色如下:

  • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
  • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
  • 具体产品(ConcreteProduct):是简单工厂模式的创建目标。

工厂方法模式:

定义:

“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

优缺点:

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度
  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
//工厂方法模式
    public static void main(String[] args) {
        try {
            Product a;
            AbstractFactory af;
            af = (AbstractFactory) ReadXML1.getObject();
            a = af.newProduct();
            a.show();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

抽象工厂模式:

定义:

是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

使用抽象工厂模式一般要满足以下条件。

  • 系统中有多个产品,每个具体工厂创建同一种但属于不同等级结构的产品。
  • 系统一次只可能消费其中某一种产品,即同种的产品一起使用。

缺点:

其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

 抽象工厂(说白了就是一个接口)

interface AbstractFactory {
    public Product1 newProduct1();
    public Product2 newProduct2();
}

具体工厂(说白了就是一个方法)

class ConcreteFactory1 implements AbstractFactory {
    public Product1 newProduct1() {
        System.out.println("具体工厂 1 生成-->具体产品 11...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2() {
        System.out.println("具体工厂 1 生成-->具体产品 21...");
        return new ConcreteProduct21();
    }
}

参考文章:

抽象工厂模式(详解版)前面介绍的 工厂方法模式 中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。 同种类称为同等级,也就是说:http://c.biancheng.net/view/1351.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式设计框架是两个不同的概念,但它们之间存在一定的关系。 首先,Java设计模式是一种解决软件设计问题的通用解决方案,它提供了一套被广泛接受和使用的设计原则和模板,可用于解决各种设计问题。设计模式具有一定的普适性和可重用性,能够帮助开发人员更好地组织代码,提高软件的可维护性和可扩展性。Java设计模式包括23种经典的设计模式,如单例模式工厂模式、观察者模式等。 而Java设计框架是一种为特定领域或问题提供解决方案的软件框架,它提供了一系列已经实现的可复用的组件和模块,使得开发人员能够更加高效地开发应用程序。设计框架通常由一组库、工具和标准规范组成,它们提供了一种开发应用程序的结构和约定,并定义了应用程序的组织结构以及组件之间的交互方式。常见的Java设计框架包括Spring、Hibernate、Struts等。 从关系上讲,Java设计框架可以使用Java设计模式来实现其内部的各种功能和机制。设计模式提供了一种被广泛接受的解决方案,并抽象和封装了一些通用的设计问题和模式。Java设计框架可以基于这些设计模式来实现自己的特定功能,从而提供更加高效和可靠的开发框架。 同时,Java设计框架也可以通过提供一些常见的设计模式作为接口和规范,帮助开发人员更好地理解和使用框架。设计模式提供了一种通用的思维方式和设计范式,通过使用设计模式,开发人员可以更加规范地进行开发,提高代码的质量和可读性。 综上所述,Java设计模式设计框架是两个相互关联但又独立存在的概念。设计模式提供了通用的解决方案,设计框架则能够应用和实现这些解决方案,从而提供更加高效和可靠的开发框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值