博客
关于我
1. 简单工厂模式
阅读量:637 次
发布时间:2019-03-14

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

简单工厂模式是一种设计模式,其核心思想是通过引入一个工厂类,让用户在使用对象时无需关心对象的具体创建细节,从而降低系统的耦合度,提高设计的可维护性和扩展性。

1. 简单工厂模式的定义

简单工厂模式(Static Factory Pattern)通过定义一个工厂类,根据传入的参数返回不同类的实例。这些实例通常都具有相同的父类。工厂类通常提供静态方法,这种模式也被称为静态工厂方法模式。它是一种创建型模式,主要用于将对象的创建过程与使用过程分离开来。

2. 工厂模式的角色

工厂模式的核心是工厂类的设计,通常包括以下三个角色:

  • 工厂角色(Factory)

    • 负责创建所有产品实例的内部逻辑。
    • 可以被外界直接调用,创建所需的产品对象。
    • 提供静态的工厂方法factoryMethod(),返回类型为Product的抽象产品类型。
  • 抽象产品角色(Abstract Product)

    • 是工厂类创建的所有对象的父类,封装了不同产品的共有方法。
    • 提供一个统一的接口,所有具体产品角色都需要实现它的方法。
  • 具体产品角色(Concrete Product)

    • 是最终的创建目标,继承自抽象产品角色。
    • 实现了抽象产品中声明的抽象方法,提供具体的产品功能。
  • 3. 工厂模式的实现

    简单工厂模式的实现通常包括以下几个部分:

  • 抽象产品类
  • public abstract class Product {
    public void methodSame() {
    // 公共方法的实现
    }
    public abstract void methodDiff(); // 抽象业务方法
    }
    1. 具体产品类A
    2. public class ConcreteProductA extends Product {
      @Override
      public void methodDiff() {
      // 业务方法的实现
      }
      }
      1. 具体产品类B
      2. public class ConcreteProductB extends Product {
        @Override
        public void methodDiff() {
        // 业务方法的实现
        }
        }
        1. 工厂类
        2. public class Factory {
          public static Product getProduct(String type) {
          Product product = null;
          if (type.equals("A")) {
          product = new ConcreteProductA();
          } else if (type.equals("B")) {
          product = new ConcreteProductB();
          }
          return product;
          }
          }
          1. 客户端调用
          2. public class Client {
            public static void main(String[] args) {
            Product product = Factory.getProduct("A");
            product.methodSame();
            product.methodDiff();
            }
            }

            4. 对象创建的几种方法

            在简单工厂模式中,对象的创建可以通过以下几种方式:

          3. 直接使用new关键字

            Object obj = new Object();

            优点:简单易行,缺点:难以扩展,需要修改源代码。

          4. 通过反射机制创建

            Object obj = (Object) Class.forName("com.example.MyClass").newInstance();

            优点:支持动态加载类,缺点:性能较差,且不符合Java的最佳实践。

          5. 通过克隆方法创建

            Object obj = objToClone.clone();

            优点:保留了对象的唯一性,缺点:需要实现clone()方法。

          6. 通过工厂类创建

            Product product = Factory.getProduct("A");

            优点:实现了对象创建与使用的分离,易于管理,适合多种产品类型,减少了类之间的耦合,支持动态配置(如通过配置文件)。

          7. 5. 工厂模式的优缺点

            简单工厂模式的使用具有以下优点:

          8. 实现对象创建与使用的分离:用户只需要关注对象的使用,不需要知道其创建过程。
          9. 对用户友好:用户只需传入参数,工厂自动返回正确的对象实例。
          10. 支持动态配置:可以通过配置文件或其他外部机制动态改变产品类的选择,减少代码修改。
          11. 其缺点包括:

          12. 工厂类职责过重:一旦工厂类出现故障或不能正常工作,整个系统都会受到影响。
          13. 增加类的复杂度:引入工厂类和抽象产品类会增加系统的类数量,增加维护成本。
          14. 不利于快速添加新产品:要添加新产品类型,需要修改工厂类的逻辑,降低了扩展性。
          15. 静态工厂方法的局限性:静态工厂方法无法形成基于继承的等级结构,限制了系统的灵活性。
          16. 6. 工厂模式的适用场景

            简单工厂模式适用于以下场景:

          17. 对象创建较少:系统中创建对象的频率较低。
          18. 客户端只了解参数,不关心具体实现:客户端只需要知道传入工厂类的参数,工厂自动返回相应的对象实例。
          19. 通过以上分析,可以清晰地看到简单工厂模式在设计模式中的重要作用,以及它在实际开发中的应用场景。

    转载地址:http://yzmoz.baihongyu.com/

    你可能感兴趣的文章
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    node exporter完整版
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>