淄博网站设网站建设 是否计入固定资产

当前位置: 首页 > news >正文

淄博网站设,网站建设 是否计入固定资产,东莞市建设厅官方网站,门户网站举例工厂模式#xff08;Factory Pattern#xff09;是一种创建型设计模式#xff0c;它提供了一种封装对象创建过程的方式#xff0c;使得对象的创建与使用分离#xff0c;从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与… 工厂模式Factory Pattern是一种创建型设计模式它提供了一种封装对象创建过程的方式使得对象的创建与使用分离从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与“使用对象”的操作分开将实例化对象的责任交给专门的工厂类负责。这样可以降低系统的耦合度提高系统的可扩展性和可维护性。 二、定义与结构 1、定义 工厂模式稳坐创建型设计模式的头把交椅其核心使命是匠心独运地架构一种精妙绝伦的机制使得对象的创建环节与使用环节能够井水不犯河水地分离开来。具体而言它仰仗一个或多个专业打造的工厂类依据预设的特定规则、传入的精准参数或者实时监测到的系统条件英明决断究竟该打造何种类型的对象并将成品对象精准无误地交付给翘首以盼的代码模块。 2、工厂模式有两种主要形式 2.1、简单工厂模式不作为设计模式被正式认可但它是一个常用的概念。它不是严格的设计模式因为它违反了开闭原则对扩展开放对修改关闭。简单工厂模式包含 工厂类负责接收所有创建请求。产品接口或抽象类定义产品的公共接口。具体产品类实现产品接口的具体产品。 2.2、工厂方法模式是一种更正式的设计模式它解决了简单工厂模式的问题并且遵循开闭原则。它包括 抽象工厂Abstract Factory声明了一个创建产品的接口其中的工厂方法用于实例化一个产品。通常以抽象类或者接口这般高冷姿态示人它宛如一位高瞻远瞩的总设计师定义了一系列用于创建紧密相关的一系列产品对象的抽象方法集。这些抽象方法如同精密模具为后续衍生出的具体工厂子类勾勒出清晰、统一且规范的创建框架确保在整个产品家族创建过程中的规范性与一致性得以严格保障。具体工厂Concrete Factory实现抽象工厂接口负责实例化具体的产品。作为抽象工厂的忠实拥趸具体工厂类或是继承自抽象工厂抽象类或是精准实现其接口。每个具体工厂类都如同一位专注的能工巧匠与某一种特定类型的产品深度绑定不离不弃。它负责将抽象工厂中定义的抽象创建方法生动具象化凭借精湛技艺实实在在地生产出对应的具体产品对象将抽象的创意构想落地生根。抽象产品Abstract Product定义了产品的接口具体的产品类将实现这个接口。抽象产品恰似一份精心绘制的蓝图多以抽象类或接口呈现。它事无巨细地概括了产品所应具备的公共方法、必备属性为所有跃跃欲试的具体产品类精心规划了前行方向是判断具体产品是否达标的严苛基准线。具体产品Concrete Product实现了抽象产品接口是工厂模式所创建的对象。具体产品类则是依据抽象产品所勾勒的蓝图加班加点精心打造出来的实体杰作。它们或是继承自抽象产品类或是完美实现其接口通过夜以继日地实现其中所定义的各种方法赋予了产品鲜活的生命力展现出实实在在的功能与特性以满足千变万化的业务场景需求。 2.3、抽象工厂模式提供了一组相关或相互依赖的对象的创建接口而无需指定它们具体的类。这是一种更为复杂的工厂模式通常用来创建一系列相关的对象。 三、实现步骤及代码示例 以Java为例展示工厂模式的具体使用。 1、简单工厂模式 // 抽象产品 interface Car {void drive(); }// 具体产品 class BMW implements Car {Overridepublic void drive() {System.out.println(Driving BMW);} }class Benz implements Car {Overridepublic void drive() {System.out.println(Driving Benz);} }// 工厂类 class CarFactory {public static Car createCar(String type) {if (BMW.equalsIgnoreCase(type)) {return new BMW();} else if (Benz.equalsIgnoreCase(type)) {return new Benz();}return null;} }// 客户端代码 public class Client {public static void main(String[] args) {Car car1 CarFactory.createCar(BMW);car1.drive();Car car2 CarFactory.createCar(Benz);car2.drive();} }2、工厂方法模式 // 抽象产品 interface Car {void drive(); }// 具体产品 class BMW implements Car {Overridepublic void drive() {System.out.println(Driving BMW);} }class Benz implements Car {Overridepublic void drive() {System.out.println(Driving Benz);} }// 抽象工厂 interface CarFactory {Car createCar(); }// 具体工厂 class BMWFactory implements CarFactory {Overridepublic Car createCar() {return new BMW();} }class BenzFactory implements CarFactory {Overridepublic Car createCar() {return new Benz();} }// 客户端代码 public class Client {public static void main(String[] args) {CarFactory bmwFactory new BMWFactory();Car bmw bmwFactory.createCar();bmw.drive();CarFactory benzFactory new BenzFactory();Car benz benzFactory.createCar();benz.drive();} }3、抽象工厂模式 由于抽象工厂模式较为复杂此处不展开代码示例但核心思想是提供一个接口用于创建相关或依赖对象的家族而不需要指明具体类。 四、常见技术框架应用 1、Spring框架 应用场景在Spring框架中工厂模式常用于Bean的创建和管理。Spring容器通过工厂模式来实例化和管理应用程序中的Bean使得开发者无需手动创建和管理这些对象。 实现方式Spring容器通过反射机制来调用具体的工厂方法或构造器创建Bean实例。同时Spring还支持通过配置文件或注解来指定Bean的创建方式和依赖关系。 2、MyBatis框架 应用场景MyBatis框架中SqlSessionFactory是创建SqlSession的工厂类。SqlSession是MyBatis的核心接口用于执行SQL语句和管理事务。 实现方式MyBatis通过读取配置文件或注解来构建SqlSessionFactory然后通过SqlSessionFactory来创建SqlSession实例。这样开发者无需直接操作数据库连接和SQL语句提高了代码的可维护性和可扩展性。 3、Java EE/Jakarta EE 应用场景在Java EE/Jakarta EE中工厂模式常用于创建和管理企业级应用中的组件和服务。例如JNDIJava Naming and Directory Interface服务通过工厂模式来查找和获取各种资源如数据库连接、消息队列等。 实现方式Java EE/Jakarta EE提供了多种工厂类和接口来支持企业级应用的开发。开发者可以通过这些工厂类和接口来获取所需的服务和资源而无需关心具体的实现细节。 4、日志框架如Log4j、SLF4J 应用场景日志框架中工厂模式常用于创建不同类型的日志记录器。根据不同的配置或运行时参数可以动态地创建和使用不同的日志对象。 实现方式日志框架通常定义了一个日志接口和多个具体的日志实现类。然后通过工厂模式来根据配置或参数创建具体的日志记录器实例。这样开发者可以在不修改代码的情况下灵活地切换日志实现。 5、UI框架如Swing、JavaFX 应用场景在UI框架中工厂模式常用于创建和管理用户界面组件。通过工厂模式可以方便地创建和配置各种UI组件如按钮、文本框、标签等。 实现方式UI框架通常提供了一组工厂类或方法来创建和管理UI组件。开发者可以通过这些工厂类或方法来创建所需的UI组件并设置其属性和行为。 以 Spring Boot 框架创建不同数据源连接为例 首先定义抽象产品 // 抽象产品数据源连接 public interface DataSourceConnection {void connect();void close(); }接着创建具体产品 // 具体产品MySQL 数据源连接 public class MySQLDataSourceConnection implements DataSourceConnection {Overridepublic void connect() {System.out.println(正在连接 MySQL 数据源…);// 实际连接 MySQL 数据库的代码此处省略如加载驱动、配置 URL、用户名、密码等}Overridepublic void close() {System.out.println(正在关闭 MySQL 数据源连接…);// 关闭连接的代码此处省略} }// 具体产品Oracle 数据源连接 public class OracleDataSourceConnection implements DataSourceConnection {Overridepublic void connect() {System.out.println(正在连接 Oracle 数据源…);// 实际连接 Oracle 数据库的代码此处省略如加载驱动、配置 URL、用户名、密码等}Overridepublic void close() {System.out.println(正在关闭 Oracle 数据源连接…);// 关闭连接的代码此处省略} }然后定义抽象工厂 // 抽象工厂数据源连接工厂 public abstract class DataSourceConnectionFactory {public abstract DataSourceConnection createConnection(); }再创建具体工厂 // 具体工厂MySQL 数据源连接工厂 public class MySQLDataSourceConnectionFactory extends DataSourceConnectionFactory {Overridepublic DataSourceConnection createConnection() {return new MySQLDataSourceConnection();} }// 具体工厂Oracle 数据源连接工厂 public class OracleDataSourceConnectionFactory extends DataSourceConnectionFactory {Override ·public DataSourceConnection createConnection() {return new OracleDataSourceConnection();} }最后在 Spring Boot 应用中使用 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class DataSourceConfig {Beanpublic DataSourceConnectionFactory mySQLDataSourceConnectionFactory() {return new MySQLDataSourceConnectionFactory();}Beanpublic DataSourceConnectionFactory oracleDataSourceConnectionFactory() {return new OracleDataSourceConnectionFactory();} }在其他业务代码中就可以通过 Autowired 注解注入工厂类进而获取相应的数据源连接例如 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service public class DatabaseService {Autowiredprivate DataSourceConnectionFactory mySQLDataSourceConnectionFactory;public void doSomething() {DataSourceConnection connection mySQLDataSourceConnectionFactory.createConnection();connection.connect();connection.close();} }以 Hibernate 框架为例 在 Hibernate 中SessionFactory 可看作是抽象工厂它负责创建 Session相当于产品。 import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class HibernateExample {public static void main(String[] args) {// 创建 SessionFactory相当于创建抽象工厂SessionFactory sessionFactory new Configuration().buildSessionFactory();// 从工厂中获取 Session相当于使用具体工厂创建产品Session session sessionFactory.openSession();// 使用 Session 进行数据库操作此处省略具体代码session.close();sessionFactory.close();} }这里Configuration 类中的一些配置方法和内部逻辑就类似于具体工厂的构建过程最终构建出 SessionFactory而 SessionFactory 依据配置信息创建出 Session用于后续的数据库交互操作。 五、应用场景 复杂对象创建当对象创建涉及读取复杂配置文件获取关键初始化参数像创建数据库连接对象时要依据配置文件中的数据库 URL、用户名、密码精准配置还要加载特定的数据库驱动程序工厂模式便能大显身手将这些复杂且易错的操作统统封装进工厂类中使得业务代码只需关注如何使用创建好的对象彻底与复杂的创建过程绝缘。多类型对象按需创建依据用户输入如图形编辑软件根据用户所选图形类型创建圆形、矩形、三角形等不同图形、系统状态如电商系统根据促销活动创建不同折扣的商品对象、业务规则如根据不同的会员等级提供不同服务套餐等条件工厂模式通过巧妙设计不同的使具体工厂能够精准无误地根据各种条件创建出对应的对象满足多样化的业务需求实现个性化服务。对象创建逻辑频繁变动在电商促销活动期间需要根据不同的促销规则频繁创建不同折扣的商品对象又或是在软件系统迭代升级过程中需要不断调整对象的创建逻辑以适应新的架构要求。此时工厂模式的优势就淋漓尽致地展现出来了它能够在工厂类中方便地修改和扩展对象创建逻辑而不会对使用这些对象的另业务代码造成任何影响确保了系统的稳定性与可维护性让代码在变革中依然保持优雅。 六、优缺点 优点 解耦对象创建与使用清晰地划分了对象创建和使用的职责边界极大地降低了代码之间的耦合度。使得使用对象的代码能够独立于对象的创建过程便于后续的维护与扩展。当需要对对象创建方式进行调整时只需在工厂类中进行改动而不会波及到整个代码库为代码的长期演进提供了保障。提高代码复用性工厂类具有很强的复用性尤其是在对象创建过程比较复杂的情况下复用工厂类能够避免在多个地方重复编写繁琐的创建代码。例如多个模块都需要创建相同类型的数据库连接对象此时只需复用同一个数据库连接工厂即可大大提高了开发效率减少了代码冗余。便于代码的维护和扩展当需要添加新的产品或者修改产品的创建逻辑时只需要在所在的工厂类和相应的产品类中进行修改而不会影响到其他使用这些产品的代码。例如要在图形绘制系统中添加一种新的品类型只需要创建新的具体产品类和对应的具体工厂类而不需要修改图形绘制的主程序使得系统的可扩展性得到了显著提升能快速适应业务的变化。 优点 增加代码复杂性引入工厂模式必然会增加代码的层次结构和类的数量。对于一些简单的应用场景如果过度使用工厂模式反而会使代码变得更加复杂晦涩难懂增加了开发人员的理解成本和维护难度。原本简单直接的创建过程可能被层层工厂类包裹让人迷失在代码的迷宫之中。工厂类可能会变得复杂如果工厂需要创建的产品种类过多或者产品的创建逻辑非常复杂工厂类本身可能会变得庞大而复杂不利于代码的维护。例如一个工厂类需要根据几十种不同的条件来创建不同类型的对象此时这个工厂类的代码将会非常冗长难以理清其中的逻辑关系给后续的维护工作带来巨大挑战甚至可能成为代码维护的“黑洞”。 工厂模式凭借其独特的设计理念为对象创建提供了一种高效、灵活且易于维护的解决方案。尽管存在一定的局限性但在复杂多变的软件开发场景中只要合理运用就能充分发挥其优势助力打造高质量的软件系统。