工厂模式是一种创建型设计模式,它提供了一种将对象的创建过程封装起来的方式,其主要作用是封装对象的创建过程,从而使得系统更加灵活、可扩展和易于维护。在工厂模式中,我们不直接使用new关键字来实例化对象,而是通过一个工厂类来创建所需类型的对象。这样可以将对象的创建过程从客户端代码中抽离出来,并使得系统更加灵活、可扩展。
工厂模式通常包括三个角色:
- 抽象产品类(Product):定义产品的共同属性和方法,具体产品继承自抽象产品类。
- 具体产品类(ConcreteProduct):实现抽象产品类定义的属性和方法。
- 工厂类(Factory):提供一个创建产品的接口,根据参数的不同返回不同的具体产品实例。
工厂模式有两种实现方式:简单工厂模式和工厂方法模式。其中,简单工厂模式是指由一个工厂类负责创建所有产品,而工厂方法模式是指将每种产品的创建过程都委托给对应的工厂子类来完成。
用Java语言实现简单工厂模式
// 抽象产品类
public interface Product {
void getName();
}
// 具体产品类A
public class ConcreteProductA implements Product {
@Override
public void getName() {
System.out.println("我是产品A");
}
}
// 具体产品类B
public class ConcreteProductB implements Product {
@Override
public void getName() {
System.out.println("我是产品B");
}
}
// 工厂类
public class Factory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
} else {
return null;
}
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
Product productA = Factory.createProduct("A");
productA.getName(); // 我是产品A
Product productB = Factory.createProduct("B");
productB.getName(); // 我是产品B
}
}
优点:
1、隐藏对象创建的过程,降低耦合性:将对象的创建与使用进行分离,创建者不需要知道具体的实现细节,只需要调用工厂方法即可,从而减少创建者与产品类之间的耦合度。
2、提高代码的可维护性:由于所有的对象都由工厂创建并管理,因此,在需要修改某个对象的创建方式时,只需要修改工厂的代码即可,而不需要修改所有的产品类的代码,提高了代码的可维护性。
3、便于添加新的产品类:具体的产品类可以通过继承或实现工厂接口来添加到系统中,这样就可以方便地扩展产品族。
缺点:
1、增加了系统的复杂度:引入工厂模式会增加系统的复杂度,需要增加额外的代码,从而增加了系统的开发难度和维护成本。
2、增加了工厂类的数量:由于每个具体的产品都需要一个相应的工厂类来进行创建,因此在系统中会产生很多工厂类,增加了系统的复杂度和开销。
3、无法避免修改工厂类:当需要添加新的产品时,必须修改工厂类的代码,这与开闭原则(对扩展开放,对修改关闭)相违背。
4、工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,每次新建一个产品都需要增加一个 if 判断分支才能支持。而且当产品类型较多时,简单工厂的 if 判断将会非常多,不容易维护。