( 五 )、设计模式 之 简单工厂模式(SimpleFactory)

( 五 )、设计模式 之 简单工厂模式(SimpleFactory)

 

 

1、简介

定义:简单工厂模式提供了一个创建对象实例的功能,而无需关心其具体的实现。该工厂用于选择接口或抽象的具体实现,返给调用方。

这使得你可以在程序运行时动态地创建对象,如果一个类有多个子类(或者一个接口有多个实现),那么使用工厂模式可以使得代码更加简洁,易于维护。

 

2、优缺点

优点:

  1. 代码简洁:简单工厂模式将对象的创建和使用分离,使得代码更加清晰简洁,易于维护。
  2. 单一职责:工厂类只负责创建对象,没有其他的职责,这使得代码更加单一,职责明确。

缺点:

  1. 违反了“开闭原则”:在简单工厂模式中,如果要增加新的产品类,就需要修改工厂类,这违反了“开闭原则”。

  2. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。

 

3、应用场景

何时选用简单工厂模式? 
  • 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。
  • 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,
     从而实现集中管理和控制。
  • 对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

案例
举一个例子,假设有一个订单支付功能,有两种支付方式:支付宝支付和微信支付。用户在客户端进行支付时,需要从这两种支付方式中选取一种,进行支付操作。在这种情况下,可以创建一个简单工厂模式来决定创建出哪一种支付方式的实例。

 

4、模式的结构与实现

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

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

 

5、简单工厂模式代码示例:

public class Client {
    public static void main(String[] args) {
    }
    //抽象产品
    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显示...");
        }
    }
    final class Const {
        static final int PRODUCT_A = 0;
        static final int PRODUCT_B = 1;
        static final int PRODUCT_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();
            }
            return null;
        }
    }
}

 

posted @ 2021-08-29 23:32  邓维-java  阅读(82)  评论(0)    收藏  举报