工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。工厂模式有三种类型:简单工厂、工厂方法和抽象工厂。简单工厂模式只有一个工厂类,负责生产所有产品;工厂方法模式将产品的创建过程封装在抽象的工厂类中,由子类实现具体的创建过程;抽象工厂模式则是提供一个接口,让客户端通过这个接口来获取多个产品族中的产品 。
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
工厂模式主要有以下几种类型:
1、简单工厂模式:这是最简单的工厂模式,它只有一个方法用于创建对象,这种模式的优点是简单易懂,但缺点是扩展性较差,因为它不支持添加新的产品类。
2、工厂方法模式:这种模式通过将对象的创建推迟到子类中实现,从而实现了高阶抽象,这种模式的优点是扩展性强,可以轻松地添加新的产品类,但缺点是增加了代码的复杂性。
3、抽象工厂模式:这种模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来,这种模式的优点是可以很容易地添加新的产品类,同时保持了代码的简洁性,但缺点是需要维护多个工厂实例。
4、建造者模式:这种模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示,这种模式的优点是可以减少冗余代码,提高代码的可读性和可维护性,但缺点是需要额外的数据结构来存储中间结果。
5、原型模式:这种模式通过复制现有对象来创建新对象,而不是通过实例化新对象,这种模式的优点是可以节省系统资源,但缺点是可能会导致系统复杂性增加。
下面我们通过一个简单的例子来说明工厂模式的使用:
假设我们有一个汽车制造厂,它生产多种不同类型的汽车,每种汽车都有自己的特点和功能,我们可以使用工厂模式来创建这些汽车对象,而不是直接使用构造函数。
我们需要定义一个汽车接口:
public interface Car { void drive(); }
我们可以为每种汽车创建一个实现类:
public class SportsCar implements Car { @Override public void drive() { System.out.println("Driving a sports car"); } } public class Sedan implements Car { @Override public void drive() { System.out.println("Driving a sedan"); } }
我们需要创建一个汽车工厂接口:
public interface CarFactory { Car createCar(); }
我们可以为每种汽车创建一个具体的工厂实现类:
public class SportsCarFactory implements CarFactory { @Override public Car createCar() { return new SportsCar(); } } public class SedanFactory implements CarFactory { @Override public Car createCar() { return new Sedan(); } }
我们可以在客户端代码中使用工厂来创建汽车对象:
public class Main { public static void main(String[] args) { CarFactory sportsCarFactory = new SportsCarFactory(); Car sportsCar = sportsCarFactory.createCar(); sportsCar.drive(); // Output: Driving a sports car CarFactory sedanFactory = new SedanFactory(); Car sedan = sedanFactory.createCar(); sedan.drive(); // Output: Driving a sedan } }