【Java设计模式 | 创建者模式】工厂方法模式

张开发
2026/4/8 3:34:07 15 分钟阅读

分享文章

【Java设计模式 | 创建者模式】工厂方法模式
前言创建者模式主要关注是“怎么创建对象”它的主要特点是将对象的创建和使用分离。这样可以降低系统的耦合度使用者不需要关注对象的创建细节。创建者模式分为单例模式Singleton【Java设计模式 | 创建者模式】单例模式-CSDN博客工厂方法模式Factory Method【Java设计模式 | 创建者模式】工厂方法模式-CSDN博客抽象工厂模式Abstract Factory【Java设计模式 | 创建者模式】 抽象工厂模式-CSDN博客建造者模式Builder原型模式Prototype在Java中万物皆对象这些对象都需要创建如果都是用new来创建该对象就会对该对象耦合严重假如我们要更换对象所有new对象的地方都需要去修改这显然违背了软件设计的开闭原则。如果我们我们使用工厂来生产对象就可以只和工厂打交道实现对对象的解耦。所以说工厂模式最大的优点就是解耦。简单工厂模式并不属于GOF的23种经典模式结构简单工厂模式包含如下角色产品接口定义了产品的规范描述了产品的主要特性和功能。具体产品实现或者继承抽象产品的子类。具体工厂提供了创建产品的方法调用者通过该方法来创建产品。实现产品接口定义了所有产品共有的方法display()具体产品类ConcreteProductA和ConcreteProductB实现了产品接口工厂类SimpleFactory包含静态方法createProduct()根据输入参数创建不同类型的产品对象客户端代码通过调用工厂方法获取产品实例无需直接实例化具体产品类// 定义产品接口 interface Product { void display(); } // 具体产品类A class ConcreteProductA implements Product { Override public void display() { System.out.println(This is Product A); } } // 具体产品类B class ConcreteProductB implements Product { Override public void display() { System.out.println(This is Product B); } } // 简单工厂类 class SimpleFactory { public Product createProduct(String type) { if (type.equalsIgnoreCase(A)) { return new ConcreteProductA(); } else if (type.equalsIgnoreCase(B)) { return new ConcreteProductB(); } throw new IllegalArgumentException(Unknown product type); } } // 客户端代码 public class FactoryPatternDemo { public static void main(String[] args) { Product productA SimpleFactory.createProduct(A); productA.display(); Product productB SimpleFactory.createProduct(B); productB.display(); } }优点封装了创建对象的过程可以通过参数创建对应的对象。把对象的创建和业务逻辑层分开这样就降低了修改客户端代码的可能性。缺点如果后期需要添加产品“C”还是需要修改工厂中的代码产生了新的耦合还是违背了开闭原则。静态工厂模式并不属于GOF的23种经典模式与简单工厂模式唯一不同的就是创建产品的方法使用static修饰。// 简单工厂类 class SimpleFactory { public static Product createProduct(String type) { if (type.equalsIgnoreCase(A)) { return new ConcreteProductA(); } else if (type.equalsIgnoreCase(B)) { return new ConcreteProductB(); } throw new IllegalArgumentException(Unknown product type); } }工厂方法模式针对简单工厂模式和静态工厂模式的弊端我们选择引入工厂方法模式来解决工厂方法模式完全遵循了开闭原则。概念定义一个用于创建对象的接口让子类决定实例化哪个产品对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。结构工厂方法模式的主要角色抽象工厂Abstract Factory提供了创建产品的接口调用者通过它访问的具体工厂的工厂方法来创建产品。具体工厂ConcreteFactory主要是实现抽象工厂中的抽象方法完成了具体产品的创建。产品接口Product定义了产品的规范描述了产品的主要特性和功能。具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建。它同具体工厂之间一一对应。实现//抽象产品接口Product public interface Product { void operation(); } //具体产品类ConcreteProduct public class ConcreteProductA implements Product { Override public void operation() { System.out.println(ConcreteProductA operation); } } public class ConcreteProductB implements Product { Override public void operation() { System.out.println(ConcreteProductB operation); } } //抽象工厂类Abstract Factory public abstract class AbstractFactory { public abstract Product createProduct(); } //具体工厂类Concrete Factory public class ConcreteFactoryA extends AbstractFactory { Override public Product createProduct() { return new ConcreteProductA(); } } public class ConcreteFactoryB extends AbstractFactory { Override public Product createProduct() { return new ConcreteProductB(); } } //客户端代码示例 public class Client { public static void main(String[] args) { AbstractFactory factoryA new ConcreteFactoryA(); Product productA factoryA.createProduct(); productA.operation(); AbstractFactory factoryB new ConcreteFactoryB(); Product productB factoryB.createProduct(); productB.operation(); } } //输出结果 ConcreteProductA operation ConcreteProductB operation优点用户只需要知道具体工厂的名称即可创建对应的产品无需知道产品的创建过程在系统增加新的产品时只需要添加对应的具体产品类和具体工厂类即可无需对原工厂类进行任何修改满足开闭原则。缺点每增加一个产品就需要添加对应的具体产品类和具体工厂类写起来更繁琐。

更多文章