工厂模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型,该模式建议使用特殊的工厂方法代替对象构造函数地直接调用,对象具体创建仍需使用new运算符,只不过被委托在工厂方法中调用,工厂模式返回的对象通常被称作产品。本文将简单介绍工厂模式的适用场景、实现方式、以及优缺点。
适合应用场景
-
当编写代码过程中无法预知对象确切类别及其依赖关系时或者需要根据不同的条件来创建不同的对象时,可以使用工厂模式来统一管理这些对象的创建过程,避免代码重复和冗余。
-
当需要向客户端隐藏具体的对象创建过程时,可以使用工厂模式来封装对象的创建过程,使得客户端代码更加简洁和易于维护。
-
当希望你的代码库或框架地内部组件能被扩展时,也可以使用工厂方法。
实现方式
本文介绍两种实现方式,分别为简单工厂模式和工厂方法模式。
简单工厂模式
简单工厂模式又称为静态工厂模式,它由一个工厂类来负责创建所有的产品对象。客户端需要通过工厂类来获取所需的对象,而不需要知道具体的对象创建过程。
示例代码如下:
public 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("非法产品类型!");
}
}
}
public interface Product {
void operation();
}
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
Product productB = SimpleFactory.createProduct("B");
productA.operation();
productB.operation();
}
}
在上述示例中,我们定义了一个简单工厂类 SimpleFactory,它根据传入的参数来创建不同的产品对象。客户端调用 SimpleFactory 的静态方法 createProduct 来获取所需的产品对象,并通过产品接口 Product 来对产品进行操作。
工厂方法模式
工厂方法模式是指定义一个抽象工厂类,由具体的子类来实现工厂方法,创建不同的产品对象,抽象工厂中也可以设计默认方法。客户端需要通过工厂类来获取所需的对象,而不需要知道具体的对象创建过程。
示例代码如下:
public interface Factory {
Product createProduct();
}
public interface Product {
void operation();
}
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation.");
}
}
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation.");
}
}
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();
}
}
在上述示例中,我们定义了一个抽象工厂类 Factory,它定义了工厂方法 createProduct,由具体的子类 ConcreteFactoryA 和 ConcreteFactoryB 来实现工厂方法,创建不同的产品对象。客户端通过工厂类来获取所需的产品对象,并通过产品接口 Product 来对产品进行操作。
工厂模式的优缺点
优点:你可以避免创建者与具体产品之间的强耦合关系,将产品的创建代码放在程序单一位置,便于维护,能满足单一职责原则。同时,无需修改现有客户端代码,你就可以在程序中引入新的产品类型,也符合了开闭原则。
缺点:应用工厂方法模式需要引入新的子类,代码会毋庸置疑变得更复杂,增加代码量,对于简单的对象创建过程,使用工厂模式可能会造成代码过度设计和不必要的复杂性。
总结
工厂方法是一种常见的设计模式,在开发设计中是较为简单的方法,其随后可以演化为更加复杂且灵活的抽象工厂、原型或生成器模式。工厂方法常与其他设计模式组合使用,例如作为大型模板方法中的一个步骤。工厂模式可以帮助我们封装复杂对象的创建过程,统一管理对象的创建过程,提高代码的可复用性、可维护性和可扩展性。在使用工厂模式时,需要根据具体的场景进行选择和应用,避免过度设计和不必要的复杂性。