工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。工厂模式通常涉及以下几个角色:抽象工厂(Abstract Factory) :定义一个创建对象的接口,但不负责具体的对象创建过程。它通常是一个接口或者抽象类,其中定义了一个或多个创建对象的方法。具体工厂(Concrete Factory) :实现抽象工厂接口,负责实际创建具体的对象。每个具体工厂都对应着一种具体的对象类型。产品(Product) :工厂所创建的对象类型。它可以是一个接口、抽象类或者具体类。,,而抽象工厂模式是在工厂方法的基础上,按照产品族或品牌等级分类工厂,减少工厂数量的一种变种。
在编程中,我们经常需要根据输入的参数来创建不同类型的对象,我们可能需要根据用户的年龄、性别或其他属性来创建不同的用户对象,这就需要我们在代码中多次使用相同的创建对象的代码,这不仅会增加代码的复杂性,而且可能会导致错误,为了解决这个问题,我们可以使用一种称为工厂模式的设计模式。
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
工厂模式的主要角色有以下几个:
1、抽象工厂(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
2、具体工厂(Concrete Factory):实现抽象工厂所定义的接口,用于生成具体的产品类。
3、抽象产品(Abstract Product):定义产品的公共接口,是其他具体产品类的父类。
4、具体产品(Concrete Product):实现抽象产品所定义的接口,是具体产品类。
5、客户端(Client):使用抽象工厂来获取产品。
下面是一个简单的工厂模式的例子:
// 抽象产品 interface Product { void show(); } // 具体产品A class ConcreteProductA implements Product { @Override public void show() { System.out.println("我是产品A"); } } // 具体产品B class ConcreteProductB implements Product { @Override public void show() { System.out.println("我是产品B"); } } // 抽象工厂 interface AbstractFactory { Product createProduct(); } // 具体工厂A class ConcreteFactoryA implements AbstractFactory { @Override public Product createProduct() { return new ConcreteProductA(); } } // 具体工厂B class ConcreteFactoryB implements AbstractFactory { @Override public Product createProduct() { return new ConcreteProductB(); } } // 客户端 public class Client { public static void main(String[] args) { // 从具体工厂A获取具体产品A Product productA = new ConcreteFactoryA().createProduct(); productA.show(); // 从具体工厂B获取具体产品B Product productB = new ConcreteFactoryB().createProduct(); productB.show(); } }
在这个例子中,我们有两个具体产品(ConcreteProductA和ConcreteProductB),每个具体产品都有自己的显示方法(show),我们还定义了一个抽象产品(Product)和两个具体工厂(ConcreteFactoryA和ConcreteFactoryB),每个具体工厂都可以根据其内部的状态来创建不同的具体产品,客户端只需要知道如何通过工厂来获取产品,而不需要关心具体的创建过程。