在软件开发中,设计模式是一种被广泛使用的解决方案,它可以帮助开发人员解决常见的问题,我们将重点讨论一种设计模式——抽象工厂模式,抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来,这样,客户端可以根据需要选择一个工厂来创建对象,而不需要知道每个工厂的具体实现细节。
抽象工厂模式的核心思想是定义一个接口,该接口包含一个或多个用于创建相关或依赖对象的方法,为每个具体工厂实现该接口,客户端只需要与抽象工厂类交互,而不需要关心具体的工厂类,这样,当需要更换工厂时,只需更换客户端代码中的接口实现即可,而无需修改客户端代码。
下面我们通过一个简单的例子来说明抽象工厂模式的用法,假设我们有一个电子产品市场,其中有三个子类:手机、电脑和平板,每个子类都有自己的生产商,分别是华为、苹果和三星,现在我们需要为这个市场提供一个统一的接口,让用户可以方便地购买各种电子产品。
我们定义一个抽象产品接口:
public interface Product { void show(); }
分别实现手机、电脑和平板类:
public class Phone implements Product { @Override public void show() { System.out.println("This is a phone."); } } public class Computer implements Product { @Override public void show() { System.out.println("This is a computer."); } } public class Tablet implements Product { @Override public void show() { System.out.println("This is a tablet."); } }
我们定义两个具体工厂类:
public class HuaweiFactory implements Factory { @Override public Product createProduct() { return new Phone(); } } public class AppleFactory implements Factory { @Override public Product createProduct() { return new Computer(); } }
我们定义一个抽象工厂类:
public interface Factory { Product createProduct(); }
并为每个具体工厂实现该接口:
public class AbstractFactory implements Factory { private final Factory factory1; private final Factory factory2; public AbstractFactory(Factory factory1, Factory factory2) { this.factory1 = factory1; this.factory2 = factory2; } @Override public Product createProduct() { return factory1.createProduct(); // 或者 factory2.createProduct(); } }
客户端代码如下:
public class Client { public static void main(String[] args) { Factory factory1 = new HuaweiFactory(); // 或者 AppleFactory(); 根据需求选择具体工厂实例化抽象工厂对象。 Factory factory2 = new AppleFactory(); // 或者 HuaweiFactory(); 根据需求选择具体工厂实例化抽象工厂对象。 AbstractFactory abstractFactory = new AbstractFactory(factory1, factory2); // 将具体工厂对象传递给抽象工厂对象。