工厂模式和抽象工厂模式都是创建型设计模式,用于通过一个共同的接口来创建对象,将对象的创建过程与使用客户端代码分离。简单工厂模式是工厂方法模式的一种变体,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。抽象工厂模式是在工厂方法的基础上,按照产品族或品牌等级分类工厂,减少工厂数量的一种变种 。
在编程中,我们经常需要根据输入参数来创建不同类型的对象,这个过程可能会变得非常繁琐和复杂,为了解决这个问题,一种非常有效的设计模式就是工厂模式,工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
工厂模式的主要角色有以下几个:
1、抽象工厂(Abstract Factory):这是一个用于创建一系列相关或相互依赖对象的接口,它提供了一种方法来封装一组具有同一主题的单独的工厂。
2、具体工厂(Concrete Factory):这是实现抽象工厂接口的具体类,它负责创建特定类型的对象。
3、抽象产品(Abstract Product):这是一个定义了产品类共同接口的抽象类或接口,所有的具体产品类都应该实现这个接口。
4、具体产品(Concrete Product):这是实现了抽象产品接口的具体类,它包含了产品类的所有功能。
5、客户(Client):这是使用抽象工厂来获取产品的客户端,它不需要知道抽象工厂和具体工厂的存在,只需要知道产品接口即可。
下面是一个简单的工厂模式的例子:
假设我们有一个汽车制造厂,它可以生产不同类型的汽车,如跑车、SUV和轿车,每种类型的汽车都有自己的特点和功能,我们可以使用工厂模式来创建这些汽车对象,而不是在客户端代码中直接创建它们。
我们需要定义一个汽车接口:
public interface Car { void drive(); }
我们可以创建三个具体的汽车类,分别表示跑车、SUV和轿车:
public class sportsCar implements Car { @Override public void drive() { System.out.println("Driving a sports car"); } } public class suv implements Car { @Override public void drive() { System.out.println("Driving an SUV"); } } public class sedan implements Car { @Override public void drive() { System.out.println("Driving a sedan"); } }
我们需要创建一个抽象工厂接口:
public interface CarFactory { Car createCar(); }
我们可以创建两个具体工厂类,分别用于创建跑车和SUV:
public class SportsCarFactory implements CarFactory { @Override public Car createCar() { return new sportsCar(); } } public class SuvFactory implements CarFactory { @Override public Car createCar() { return new suv(); } }
我们可以在客户端代码中使用工厂模式来创建汽车对象:
public class Client { public static void main(String[] args) { CarFactory factory = new SportsCarFactory(); // 或者使用 new SuvFactory(); 根据需要选择具体工厂类 Car sportsCar = factory.createCar(); // 根据需要选择具体产品类,如 sportsCar、suv等;这里以 sportsCar为例,也可以是其他具体产品类;如果要创建SUV,只需将factory替换为SuvFactory即可;如果要创建Sedan,则需要再增加一个SedanFactory以及相应的产品类;同理,如果要创建其他类型的汽车,也需相应地增加其他的产品类及对应的工厂类;这样就可以根据不同的条件来动态地创建不同的产品对象了!