设计模式之工厂模式

简介: 本篇文章是设计模式专题的第三篇文章,我会将遇到的设计模式都一一总结在该专题下,我会把自己对每一种设计模式的感悟写下来,以及在实际工作中我们该如何去灵活应用这些设计模式,欢迎大家关注。本篇文章我们就来讲一讲,最为常用的工厂模式。

工厂模式的简单介绍

工厂模式是创建型模式之一,它主要的作用也是帮助我们创建对象。在工厂模式中,我们在创建对象时不会对用户暴露创建逻辑,并且是通过使用一个统一的接口来指向新创建的对象。

工厂模式又细分为三种:

  • 简单工厂模式

    简单工厂模式可谓是最简单最实用的设计模式,我们只需要通过调用工厂为我们提供的一个方法就可以创建对象。这样虽然简单,但是有一个大的弊端就是,当我们新增一个商品时,需要去修改工厂类的代码,才可以使其为我们生产新的商品。这样会违背我们的设计原则,对扩展开放,对修改关闭。

    简单工厂就像是,新增产品需要把工厂关闭,重新进行修建,修建完成后可能会影响之前产品的生产。

    image.png

  • 工厂方法模式

    工厂方法模式就是为了改善简单工厂无法很好的保证扩展性的升级版本,我们通过构建一个抽象工厂,每次增加产品时,只需要增加一个对应的工厂实现类即可。使其可以完美的进行扩展,不需要影响以前的代码。

    工厂方法就像是,新增产品时,只需要加一个新产品的车间,丝毫不会干预到旧产品的生产。

    image.png

  • 抽象工厂模式

    抽象工厂使得工厂模式可以支持产品族的创建,创建有层级关系的产品。

    为什么会产生抽象工厂呢?就是因为简单工厂和工厂方法模式只能针对一类产品进行生产,如果想要生产其它商品只能再建一个工厂。比如说我们的工厂生产的抽象产品为汽车,那么我们就这能生产出各种汽车,而无法生产摩托车。抽象工厂的诞生就使得我们的工厂即可以生产不同型号的汽车,又可以生产不同型号的摩托车,还可以生产不同型号的飞机。

    image.png

工厂模式的具体实现思路

  • 简单工厂模式

    • 创建产品的抽象类 (一种产品)
    • 创建产品的具体实现 (不同规格的产品)
    • 创建工厂为每一种产品的具体实现,提供一个创建方法 (只有一个车间)
  • 工厂方法模式

    • 创建产品的抽象类 (一种产品)
    • 创建产品的具体实现 (不同规格的产品)
    • 创建工厂的抽象类 (车间)
    • 为每一种产品创建一种工厂的实现类 (多个车间,每个车间生产一种规格的产品)
  • 抽象工厂模式

    • 创建产品的抽象类多个 (多种产品)
    • 为每一种产品的抽象类创建具体实现 (为每一种产品提供多种规格的产品)
    • 创建工厂的抽象类,提供多种产品的生产方式 (定义工厂可以生产的品类)
    • 创建工厂的实现类,让其可以生产不同品类,不同规格的产品 (生产不同品类,不同规格的产品的具体厂家)

工厂模式的具体实现方案

  • 简单工厂

    // 抽象产品
    public interface Product {
        void method();
    }
    // 产品A
    public class ProductA implements Product {
        public void method() {
            
        }
    }
    // 产品B
    public class ProductB implements Product {
        public void method() {
            
        }
    }
    // 工厂
    public class Factory {
        public Product createProduct(String productType) {
            if (productType.equalsIgnoreCase("A")) {
                return new ProductA();
            } else if(productType.equalsIgnoreCase("B")) {
                return new ProductB();
            }
            return null;
        }
    }
  • 工厂方法

    // 抽象产品
    public interface Product {
        void method();
    }
    // 产品A
    public class ProductA implements Product {
        public void method() {
            
        }
    }
    // 产品B
    public class ProductB implements Product {
        public void method() {
            
        }
    }
    // 抽象工厂
    public interface Factory {
        Product create();
    }
    // 工厂A
    public class FactoryA implements Factory {
        public Product create() {
            return ProductA();
        }
    }
    // 工厂B
    public class FactoryB implements Factory {
        public Product create() {
            return ProductB();
        }
    }
  • 抽象工厂

    // 抽象产品A
    public interface ProductA {
        void method();
    }
    // 产品A1
    public class ProductA1 implements ProductA {
        public void method() {
            
        }
    }
    // 产品A2
    public class ProductA2 implements ProductA {
        public void method() {
            
        }
    }
    // 抽象产品B
    public interface ProductB {
        void method();
    }
    // 产品B1
    public class ProductB1 implements ProductB {
        public void method() {
            
        }
    }
    // 产品B2
    public class ProductB2 implements ProductB {
        public void method() {
            
        }
    }
    // 抽象工厂
    public interface Factory {
        ProductA createProductA();
        ProductB createProductB();
    }
    // 工厂A
    public class FactoryA implements Factory {
        // 生产A产品
        public ProductA createProductA(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                // 生产A产品规格为1的
                return new ProductA1();
            } else if(productType.equalsIgnoreCase("2")) {
                // 生产A产品规格为2的
                return new ProductA2();
            }
            return null;
        }
        // 生产B产品
        public ProductB createProductB(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                return new ProductB1();
            } else if(productType.equalsIgnoreCase("2")) {
                return new ProductB2();
            }
            return null;
        }
    }
    // 工厂B
    public class FactoryB implements Factory {
        // 生产A产品
        public ProductA createProductA(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                return new ProductA1();
            } else if(productType.equalsIgnoreCase("2")) {
                return new ProductA2();
            }
            return null;
        }
        // 生产B产品
        public ProductB createProductB(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                return new ProductB1();
            } else if(productType.equalsIgnoreCase("2")) {
                return new ProductB2();
            }
            return null;
        }
    }

工厂模式的优缺点

  • 简单工厂模式

    优点

    • 一个调用者想创建一个对象,只要知道其名称就可以了。
    • 扩展性高,如果想增加一个产品,只要扩展一个产品类就可以。
    • 将产品的具体实现封装起来,调用者只关心产品的接口。
    • 相对其他工厂方法来讲,代码简洁

    缺点

    • 每次增加一个产品时,都需要增加一个具体类,使得系统中类的个数成倍增加
    • 系统耦合度高,每次都需要修改创建产品的方法,不满足开闭原则
  • 工厂方法模式

    优点

    • 一个调用者想创建一个对象,只要需要调用对应工厂的创建方法即可。
    • 扩展性高,如果想增加一个产品,只要扩展一个产品类和一个工厂类就可以。
    • 将产品的具体实现封装起来,调用者只关心产品的接口。
    • 完美的实现开闭原则

    缺点

    • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加
    • 通过工厂模式创建对象复杂度会变高
  • 抽象工厂模式

    优点

    • 满足了产品族的创建。
    • 将产品的具体实现封装起来,调用者只关心产品的接口。

    缺点

    • 工厂模式的缺点它都有

工厂模式的适用场景

  • 简单工厂模式

    1. 工厂类负责创建的对象比较少,这样不会造成工厂方法中的业务逻辑太过复杂。
    2. 客户端需要传入工厂类不同的参数即可获得不同的产品,对于如何创建对象并不关心。
  • 工厂方法模式

    1. 客户端可以不知道它所创建对象的类。
    2. 需要经常对产品进行扩展的。
  • 抽象工厂模式

    1. 产品族的创建,有上下级关系的产品。

工厂模式总结

工厂模式有三种类型,每一种工厂模式都有它独特的特点,简单工厂模式和工厂方法模式应用场景相同,工厂方法模式的扩展性更好,也符合程序设计的开闭原则,但是需要创建大量的类,每添加一种商品都得对应的创建一个商品的具体实现和一个工厂的具体实现。抽象工厂更适合用在生产不同品类的产品,有层级关系的这种产品。

目录
相关文章
|
设计模式 Java C++
设计模式之工厂模式详解和应用
设计模式之工厂模式详解和应用
63 0
|
1月前
|
设计模式 Java 关系型数据库
设计模式——工厂模式
工厂模式介绍、静态简单工厂模式、工厂方法模式、抽象工厂模式、JDK 源码分析
设计模式——工厂模式
|
4月前
|
设计模式 数据格式 XML
设计模式-工厂模式-1-1
【6月更文挑战第10天】本文介绍了工厂模式的两种主要类型:简单工厂和工厂方法。简单工厂模式通过工厂类动态创建对象,例如根据配置文件后缀选择不同解析器。为提高可读性和复用性,可将创建逻辑封装到独立类中。当需添加新解析器时,可能涉及对工厂类的修改,但这在偶尔调整时可接受。工厂方法模式则通过多态消除if分支,增加扩展性,更符合开闭原则。当需要新增解析器时,只需创建实现特定接口的新工厂类。
30 2
设计模式-工厂模式-1-1
|
5月前
|
设计模式 消息中间件 Java
设计模式之工厂模式(C++)
设计模式之工厂模式(C++)
78 0
|
5月前
|
设计模式 算法 uml
C++设计模式(工厂模式)
C++设计模式(工厂模式)
79 1
C++设计模式(工厂模式)
|
5月前
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
73 0
|
11月前
|
设计模式 前端开发 Java
设计模式之工厂模式(1)
工厂模式是一种对象创建型模式,它提供了一种创建对象的最佳实践。在工厂模式中,我们在创建对象时不使用 new 关键字,而是通过调用工厂方法来创建对象。工厂方法是一种在子类中定义的方法,该方法负责实例化对象。工厂方法可以返回不同的对象类型,因此工厂模式可以创建一组相关或不相关的对象。这样就可以将对象的创建和使用解耦。
57 0
|
11月前
|
设计模式 Java C#
设计模式之工厂模式(2)
接着,我们定义一个抽象工厂类AbstractFactory,它有两个抽象方法createShape和createColor,分别返回一个Shape对象和一个Color对象: java
48 0
|
设计模式
【设计模式】工厂模式
【设计模式】工厂模式
|
设计模式 SQL 搜索推荐
设计模式之工厂模式(二)
设计模式之工厂模式
109 0