目录

什么是工厂模式

工厂模式变体

工厂模式优缺点

优点

缺点

简单工厂模式的实现

代码实现

工厂模式方法的实现

代码实现

抽象工厂模式的实现

代码实现

什么是工厂模式

        工厂模式是一种设计模式,用于创建对象的过程与对象使用者解耦,从而提高代码的灵活性和可维护性。在工厂模式中,将对象的创建过程封装在一个工厂类中,使用者不需要直接实例化对象,而是通过工厂类来获取所需的对象实例。

        简单来说就是,封装工厂类,工厂类获取实例。

工厂模式变体

简单工厂模式(Simple Factory Pattern): 简单工厂模式由一个工厂类负责创建所有对象实例,使用者通过调用工厂类的静态方法来获取对象实例。这种模式简单易懂,但违背了开放-封闭原则,因为每次新增一个产品都需要修改工厂类。 工厂方法模式(Factory Method Pattern): 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样可以将实例化的过程延迟到子类中,符合开放-封闭原则,但需要为每个具体产品定义一个工厂类。 抽象工厂模式(Abstract Factory Pattern): 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。它将一组具有相似主题的工厂封装起来,对于增加新的产品族很方便,但是难以增加新的产品等级结构。

工厂模式优缺点

优点

降低耦合性: 使用者只需要知道工厂类及其接口,无需关心具体的产品实现,降低了对象之间的耦合性。提高可维护性: 当需要更改产品类时,只需修改工厂类的代码,而不需要修改使用者的代码。增加扩展性: 可以根据需求轻松添加新的产品类,而无需更改现有代码。

缺点

增加了类的数量: 引入了额外的工厂类,可能会增加类的数量,使得代码结构变得复杂。增加了系统的抽象性和理解难度: 对于初学者来说,理解工厂模式的思想和实现可能会比较困难,特别是在涉及多层次的抽象工厂时。

简单工厂模式的实现

代码实现

/**

* @description:

* @author: 黎剑

* @create: 2024-04-16 22:32

**/

// 定义产品接口

interface Product {

void operation();

}

// 具体产品类A

class ConcreteProductA implements Product {

@Override

public void operation() {

System.out.println("具体产品A的操作");

}

}

// 具体产品类B

class ConcreteProductB implements Product {

@Override

public void operation() {

System.out.println("具体产品B的操作");

}

}

// 简单工厂类

class SimpleFactory {

// 根据参数创建对应的产品实例

public static Product createProduct(String type) {

if ("A".equals(type)) {

return new ConcreteProductA();

} else if ("B".equals(type)) {

return new ConcreteProductB();

} else {

throw new IllegalArgumentException("Unsupported product type: " + type);

}

}

}

// 客户端代码

public class Client {

public static void main(String[] args) {

// 使用工厂类创建产品实例

Product productA = SimpleFactory.createProduct("A");

Product productB = SimpleFactory.createProduct("B");

// 调用产品实例的操作方法

productA.operation();

productB.operation();

}

}

        在这个示例中,Product 是一个产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体的产品类,实现了 Product 接口。

SimpleFactory 是工厂类,负责根据传入的参数来创建具体的产品实例。在 Client 类中,通过调用工厂类的 createProduct 方法来获取所需的产品实例,并调用产品实例的操作方法。

这样,客户端代码与具体产品类之间解耦,客户端只需要与工厂类打交道,可以根据需要轻松切换不同的产品类型。

工厂模式方法的实现

        工厂方法模式的核心思想是定义一个抽象的工厂类,该工厂类包含一个抽象方法,用于创建产品对象。具体的产品类需要实现这个抽象方法,以创建具体的产品实例。

工厂方法模式通常包括以下角色:

抽象产品(Abstract Product): 定义了产品的接口,描述了产品的特性和行为。 具体产品(Concrete Product): 实现了抽象产品接口,定义了具体产品的具体行为。 抽象工厂(Abstract Factory): 定义了一个抽象方法,用于创建产品对象,客户端通过调用这个方法来获取产品对象。 具体工厂(Concrete Factory): 实现了抽象工厂接口,负责创建具体的产品对象。

代码实现

/**

* @description:

* @author: 黎剑

* @create: 2024-04-16 22:32

**/

// 定义抽象产品接口

interface Product {

void operation();

}

// 具体产品类A

class ConcreteProductA implements Product {

@Override

public void operation() {

System.out.println("具体产品A的操作");

}

}

// 具体产品类B

class ConcreteProductB implements Product {

@Override

public void operation() {

System.out.println("具体产品B的操作");

}

}

// 抽象工厂接口

interface Factory {

Product createProduct();

}

// 具体工厂类A

class ConcreteFactoryA implements Factory {

@Override

public Product createProduct() {

return new ConcreteProductA();

}

}

// 具体工厂类B

class ConcreteFactoryB implements Factory {

@Override

public Product createProduct() {

return new ConcreteProductB();

}

}

// 客户端代码

public class Client {

public static void main(String[] args) {

// 创建具体工厂实例

Factory factoryA = new ConcreteFactoryA();

Factory factoryB = new ConcreteFactoryB();

// 使用具体工厂创建产品实例

Product productA = factoryA.createProduct();

Product productB = factoryB.createProduct();

// 调用产品实例的操作方法

productA.operation();

productB.operation();

}

}

在这个示例中,Product 是抽象产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体的产品类,分别实现了 Product 接口。

Factory 是抽象工厂接口,定义了一个抽象方法 createProduct(),用于创建产品实例。ConcreteFactoryA 和 ConcreteFactoryB 是具体的工厂类,分别实现了 Factory 接口,并实现了 createProduct() 方法以创建具体的产品实例。

在客户端代码 Client 中,通过创建具体工厂实例,并调用其 createProduct() 方法来获取产品实例,然后调用产品实例的操作方法。

这样,客户端代码与具体产品类之间解耦,客户端只需要与抽象工厂打交道,可以根据需要轻松切换不同的具体工厂和产品类型。

抽象工厂模式的实现

        抽象工厂模式的主要目的是提供一个接口,用于创建相关对象的家族,而不需要指定具体的类。

在抽象工厂模式中,有两个关键的抽象概念:

抽象产品(Abstract Product): 定义了一系列产品的接口,描述了产品的特性和行为。 抽象工厂(Abstract Factory): 定义了一个用于创建一系列产品的接口,包括创建产品的方法。

抽象工厂模式通常包括以下角色:

抽象产品接口(Abstract Product): 定义了一系列产品的接口,描述了产品的特性和行为。 具体产品类(Concrete Product): 实现了抽象产品接口,定义了具体产品的具体行为。 抽象工厂接口(Abstract Factory): 定义了一个用于创建一系列产品的接口,包括创建产品的方法。 具体工厂类(Concrete Factory): 实现了抽象工厂接口,负责创建一系列相关的产品。

抽象工厂模式的核心思想是提供一个接口,用于创建一系列相关的产品对象,而不需要指定具体的类。客户端通过调用抽象工厂的方法来获取产品对象,从而实现了客户端代码与具体产品类之间的解耦。

代码实现

// 定义抽象产品接口A

interface AbstractProductA {

void operationA();

}

// 具体产品类A1

class ConcreteProductA1 implements AbstractProductA {

@Override

public void operationA() {

System.out.println("具体产品A1的操作");

}

}

// 具体产品类A2

class ConcreteProductA2 implements AbstractProductA {

@Override

public void operationA() {

System.out.println("具体产品A2的操作");

}

}

// 定义抽象产品接口B

interface AbstractProductB {

void operationB();

}

// 具体产品类B1

class ConcreteProductB1 implements AbstractProductB {

@Override

public void operationB() {

System.out.println("具体产品B1的操作");

}

}

// 具体产品类B2

class ConcreteProductB2 implements AbstractProductB {

@Override

public void operationB() {

System.out.println("具体产品B2的操作");

}

}

// 定义抽象工厂接口

interface AbstractFactory {

AbstractProductA createProductA();

AbstractProductB createProductB();

}

// 具体工厂类1

class ConcreteFactory1 implements AbstractFactory {

@Override

public AbstractProductA createProductA() {

return new ConcreteProductA1();

}

@Override

public AbstractProductB createProductB() {

return new ConcreteProductB1();

}

}

// 具体工厂类2

class ConcreteFactory2 implements AbstractFactory {

@Override

public AbstractProductA createProductA() {

return new ConcreteProductA2();

}

@Override

public AbstractProductB createProductB() {

return new ConcreteProductB2();

}

}

// 客户端代码

public class Client {

public static void main(String[] args) {

// 创建具体工厂实例

AbstractFactory factory1 = new ConcreteFactory1();

AbstractFactory factory2 = new ConcreteFactory2();

// 使用具体工厂创建产品实例

AbstractProductA productA1 = factory1.createProductA();

AbstractProductB productB1 = factory1.createProductB();

AbstractProductA productA2 = factory2.createProductA();

AbstractProductB productB2 = factory2.createProductB();

// 调用产品实例的操作方法

productA1.operationA();

productB1.operationB();

productA2.operationA();

productB2.operationB();

}

}

在这个示例中,AbstractProductA 和 AbstractProductB 是抽象产品接口,定义了产品的操作方法。ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2 是具体的产品类,分别实现了 AbstractProductA 和 AbstractProductB 接口。

AbstractFactory 是抽象工厂接口,定义了创建一系列产品的方法。ConcreteFactory1 和 ConcreteFactory2 是具体的工厂类,分别实现了 AbstractFactory 接口,并实现了 createProductA() 和 createProductB() 方法以创建具体的产品实例。

在客户端代码 Client 中,通过创建具体工厂实例,并调用其 createProductA() 和 createProductB() 方法来获取产品实例,然后调用产品实例的操作方法。

这样,客户端代码与具体产品类之间解耦,客户端只需要与抽象工厂打交道,可以根据需要轻松切换不同的具体工厂和产品类型。

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。