首页 > 其他分享 >小谈设计模式(9)—工厂方法模式

小谈设计模式(9)—工厂方法模式

时间:2023-12-03 10:32:10浏览次数:32  
标签:小谈 工厂 具体 产品 抽象 设计模式 public 客户端

(小谈设计模式(9)—工厂方法模式)

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 在这里插入图片描述

工厂方法模式

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式将对象的实例化推迟到子类中进行。

角色分类

抽象产品(Abstract Product)

定义了产品的接口,是具体产品类的共同父类或接口。

具体产品(Concrete Product)

实现了抽象产品接口的具体类。

抽象工厂(Abstract Factory)

定义了创建产品的接口,包含一个或多个创建产品的抽象方法。

具体工厂(Concrete Factory)

实现了抽象工厂接口,负责实例化具体产品。 在这里插入图片描述

核心思想

将对象的创建与使用分离,客户端通过调用工厂方法来创建对象,而不是直接实例化具体产品。这样做的好处是,客户端只需要知道抽象产品和抽象工厂的存在,而无需关心具体产品的细节。当需要创建不同类型的产品时,只需要实现对应的具体产品和具体工厂即可,而不需要修改客户端的代码。

在这里插入图片描述

Java代码实现:

假设有一个汽车工厂,可以生产不同类型的汽车,包括小轿车和SUV。首先定义一个抽象汽车类(AbstractProduct):

public abstract class Car {
    public abstract void drive();
}

然后定义具体的小轿车类(ConcreteProduct1)和SUV类(ConcreteProduct2),它们都继承自抽象汽车类:

public class SedanCar extends Car {
    @Override
    public void drive() {
        System.out.println("Driving sedan car...");
    }
}

public class SUV extends Car {
    @Override
    public void drive() {
        System.out.println("Driving SUV...");
    }
}

接下来定义抽象汽车工厂类(AbstractFactory),其中包含一个创建汽车的抽象方法:

public abstract class CarFactory {
    public abstract Car createCar();
}

然后定义具体的小轿车工厂类(ConcreteFactory1)和SUV工厂类(ConcreteFactory2),它们都继承自抽象汽车工厂类:

public class SedanCarFactory extends CarFactory {
    @Override
    public Car createCar() {
        return new SedanCar();
    }
}

public class SUVFactory extends CarFactory {
    @Override
    public Car createCar() {
        return new SUV();
    }
}

最后,在客户端代码中使用工厂方法来创建汽车对象:

public class Client {
    public static void main(String[] args) {
        CarFactory factory1 = new SedanCarFactory();
        Car sedanCar = factory1.createCar();
        sedanCar.drive();
        
        CarFactory factory2 = new SUVFactory();
        Car suv = factory2.createCar();
        suv.drive();
    }
}

输出结果为

Driving sedan car...
Driving SUV...

分析

通过工厂方法模式,客户端代码只需要与抽象产品和抽象工厂进行交互,而无需关心具体产品的创建过程。当需要新增其他类型的汽车时,只需要实现对应的具体产品和具体工厂即可,而不需要修改客户端的代码,实现了代码的可扩展性和可维护性。 在这里插入图片描述

优缺点分析

优点

符合开闭原则

工厂方法模式通过引入抽象工厂和具体工厂的概念,使得系统的扩展性更好。当需要新增一种产品时,只需要新增对应的具体产品和具体工厂,而不需要修改已有的代码,符合开闭原则。

封装了对象的创建过程

客户端只需要关心抽象产品和抽象工厂,而无需关心具体产品的创建过程。具体产品的创建过程被封装在具体工厂中,使得客户端代码更加简洁、可读性更高。

降低了客户端和具体产品的耦合

客户端只依赖于抽象产品和抽象工厂,而不依赖于具体产品。这样可以使客户端代码与具体产品解耦,提高代码的灵活性和可维护性。

可以通过配置文件等方式动态指定具体工厂类

工厂方法模式可以通过配置文件、反射等方式动态指定具体工厂类,从而实现更加灵活的对象创建方式。 在这里插入图片描述

缺点

增加了系统的复杂度

引入抽象工厂和具体工厂的概念,使得系统的结构变得更加复杂。如果系统中只有少量的产品,使用工厂方法模式可能会显得过于复杂,不利于维护和理解。

增加了代码的数量

工厂方法模式需要定义抽象产品、具体产品、抽象工厂、具体工厂等多个类,这增加了代码的数量。对于简单的项目,使用工厂方法模式可能会显得冗余。

客户端需要知道具体工厂类

客户端需要知道具体工厂类的存在,这增加了客户端的依赖。如果具体工厂类的创建逻辑发生变化,客户端代码也需要相应的修改。

在这里插入图片描述

标签:小谈,工厂,具体,产品,抽象,设计模式,public,客户端
From: https://blog.51cto.com/u_16193391/8665317

相关文章

  • Java设计模式-策略模式详解
    1.策略模式基本了解策略模式(StrategyPattern)是一种行为型设计模式,它定义了一组可以相互替换的算法,使得客户端可以根据不同的需求选择不同的算法,将对象和行为分开。在策略模式中,我们创建了一个策略接口,该接口定义了所有必需的方法。然后,我们创建了实现了该策略接口的具体策略......
  • 编程设计模式中,工厂方法模式为什么叫工厂方法?(AI)
    来自你的消息:编程设计模式中,工厂方法模式为什么叫工厂方法?来自WeTabAI的消息:工厂方法模式是一种常用的面向对象设计模式,它被称为工厂方法是因为在这种模式中,我们将对象的创建过程封装到一个工厂类中,通过工厂类来创建对象。工厂方法模式的核心思想是定义一个用于创建对象的......
  • 简单工厂模式
    软件设计                 石家庄铁道大学信息学院 实验2:简单工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解简单工厂模式的动机,掌握该模式的结构;2、能够利用简单工厂模式解决实际问题。 [实验任务一]:女娲造人使用简单工厂模......
  • 工厂方法模式
    软件设计                 石家庄铁道大学信息学院 实验3:工厂方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解工厂方法模式的动机,掌握该模式的结构;2、能够利用工厂方法模式解决实际问题。 [实验任务一]:加密算法目前常用的加密......
  • 抽象工厂模式
    软件设计                 石家庄铁道大学信息学院 实验4:抽象工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解抽象工厂模式的动机,掌握该模式的结构;2、能够利用抽象工厂模式解决实际问题。 [实验任务一]:人与肤色使用抽象工厂模......
  • Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicati
    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅第四章、SpringMVC控制器开发详解二4.1核心要点......
  • 设计模式之-单例模式
    1、是什么?单例模式是一种常用的软件设计模式,它在一个类中只允许创建一个对象实例,并且提供一个全局访问点来访问该实例。2、怎么玩?单例模式需要满足三个条件:单例类只能有一个实例;单例类必须自己创建自己的唯一实例;单例类必须给所有其他对象提供这一实例。(1)懒汉式packageco......
  • SpringCloud——网关过滤工厂GatewayFilterFactory
    目录GatewayFilter工厂AddRequestHeaderAddRequestHeadersIfNotPresentAddRequestParameterAddResponseHeaderGatewayFilter工厂网关过滤器工厂GatewayFilterFactory允许以某种方式修改传入的HTTP请求或返回的HTTP响应。其作用域是某些特定路由。SpringCloudGateway包括......
  • SpringCloud——自定义断言工厂
    目录场景:用户的请求头中需要有指定的用户名和密码才能访问。断言工厂参考系统AfterRoutePredicateFactory写法。packagecom.zjw.factory;importlombok.Getter;importlombok.Setter;importorg.springframework.cloud.gateway.handler.predicate.AbstractRoutePredi......
  • 设计模式
    varobserver={list:[],subscribe:function(key,fn){if(!this.list[key]){this.list[key]=[]}this.list[key].push(fn)},publish:function(){constkey=arguments[0]this.list[key].forEach(fn=>{fn.apply(this,argu......