深入探析设计模式:工厂模式的三种姿态
- 1. 简单工厂模式
- 1.1 概念
- 1.2 案例
- 1.3 优缺点
- 2. 抽象工厂模式
- 2.1 概念
- 2.2 案例:跨品牌手机生产
- 2.3 优缺点
- 3. 超级工厂模式
- 3.1 概念
- 3.2 案例:动物园游览
- 3.3 优缺点
- 4. 总结
欢迎阅读本文,今天我们将会深入学习工厂模式,这是一种重要的设计模式,用于创建对象的实例化过程。我们将分析三种工厂模式的用法:简单工厂模式、抽象工厂模式和超级工厂模式,并通过实际案例帮助您了解如何在实际开发中应用这些模式。
1. 简单工厂模式
1.1 概念
简单工厂模式(Simple Factory Pattern)是最基础的工厂模式,它通过一个工厂类根据不同的参数来创建不同类的实例。让我们通过一个例子来理解简单工厂模式。
1.2 案例
假设我们有不同类型的汽车:轿车、越野车和卡车。我们可以创建一个汽车工厂,根据用户的选择来制造不同类型的汽车。
class CarFactory {
public Car createCar(String type) {
if ("sedan".equals(type)) {
return new SedanCar();
} else if ("suv".equals(type)) {
return new SuvCar();
} else if ("truck".equals(type)) {
return new TruckCar();
} else {
throw new IllegalArgumentException("Unknown car type");
}
}
}
interface Car {
void drive();
}
class SedanCar implements Car {
public void drive() {
System.out.println("Driving a sedan car");
}
}
class SuvCar implements Car {
public void drive() {
System.out.println("Driving an SUV car");
}
}
class TruckCar implements Car {
public void drive() {
System.out.println("Driving a truck car");
}
}
public class Main {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
Car sedan = carFactory.createCar("sedan");
Car suv = carFactory.createCar("suv");
Car truck = carFactory.createCar("truck");
sedan.drive();
suv.drive();
truck.drive();
}
}
这个案例中,CarFactory
根据用户的选择来创建不同类型的汽车实例。这是最简单的工厂模式,但它的缺点是新增汽车类型时,需要修改工厂类。
1.3 优缺点
- 优点:
- 简单易用:简单工厂模式的实现相对简单,适用于创建单一类型的对象。
- 封装创建逻辑:工厂类封装了对象的创建逻辑,客户端只需提供参数即可获得所需对象。
- 解耦:客户端与具体产品类之间解耦,降低客户端与具体类的依赖性。
- 缺点:
- 不易扩展:当需要新增产品时,需要修改工厂类的代码,违反了开闭原则。
- 代码维护难:随着产品种类增加,共产类的代码会变得臃肿,难以维护。
- 违背单一职责原则:工厂类负责了对象的创建和逻辑判断,导致职责不清晰。
2. 抽象工厂模式
2.1 概念
抽象工厂模式(Abstract Factory Pattern)是对简单工厂模式的进一步抽象,它提供了一个抽象的工厂接口,每个具体的工厂类实现这个接口以创建一系列相关或依赖对象的实例。让我们通过一个例子理解抽象工厂模式。
2.2 案例:跨品牌手机生产
假设我们要生产手机,分为不同品牌和型号。我们可以创建一个抽象的工厂接口,不同的品牌工厂实现这个接口来生产不同型号的手机。
interface PhoneFactory {
SmartPhone createSmartPhone();
FeaturePhone createFeaturePhone();
}
class AppleFactory implements PhoneFactory {
public SmartPhone createSmartPhone() {
return new IPhone();
}
public FeaturePhone createFeaturePhone() {
return new IPod();
}
}
class SamsungFactory implements PhoneFactory {
public SmartPhone createSmartPhone() {
return new Galaxy();
}
public FeaturePhone createFeaturePhone() {
return new OldPhone();
}
}
interface SmartPhone {
void makeCall();
void sendText();
}
interface FeaturePhone {
void makeCall();
}
class IPhone implements SmartPhone {
public void makeCall() {
System.out.println("Calling from iPhone");
}
public void sendText() {
System.out.println("Sending text from iPhone");
}
}
class Galaxy implements SmartPhone {
public void makeCall() {
System.out.println("Calling from Galaxy");
}
public void sendText() {
System.out.println("Sending text from Galaxy");
}
}
class IPod implements FeaturePhone {
public void makeCall() {
System.out.println("Calling from iPod");
}
}
class OldPhone implements FeaturePhone {
public void makeCall() {
System.out.println("Calling from old phone");
}
}
public class Main {
public static void main(String[] args) {
PhoneFactory appleFactory = new AppleFactory();
SmartPhone iphone = appleFactory.createSmartPhone();
FeaturePhone ipod = appleFactory.createFeaturePhone();
PhoneFactory samsungFactory = new SamsungFactory();
SmartPhone galaxy = samsungFactory.createSmartPhone();
FeaturePhone oldPhone = samsungFactory.createFeaturePhone();
iphone.makeCall();
ipod.makeCall();
galaxy.makeCall();
oldPhone.makeCall();
}
}
在这个案例中,PhoneFactory
是抽象工厂接口,不同的品牌工厂类如AppleFactory
和SamsungFactory
实现了这个接口。每个工厂类都可以创建不同品牌手机的实例。
2.3 优缺点
- 优点:
- 封装产品族创建逻辑:抽象工厂模式将一系列相关的产品组成一个产品族,工厂类负责创建整个产品族的对象。
- 满足开闭原则:新增产品时只需要扩展抽象工厂及其具体子类,不需要修改已有代码。
- 解耦产品类和客户端:客户端通过工厂接口而不是具体类来创建对象,降低了依赖。
- 缺点:
- 不易扩展新产品等级:当需要新增产品等级时,需要修改所有具体工厂类的代码。
- 复杂性增加:随着产品族和产品等级的增加,工厂和产品类的数量会增加,导致负责性提高。
3. 超级工厂模式
3.1 概念
超级工厂模式是将多个工厂模式结合在一起,形成一个层次结构的工厂模式。它可以根据不同的条件选择合适的子工厂来创建对象。让我们通过一个例子了解超级工厂模式。
3.2 案例:动物园游览
假设我们要构建一个动物园游览系统,需要创建各种动物的实例。我们可以使用超级工厂模式来管理不同种类的工厂,每个工厂负责创建一类动物。
// 动物接口
interface Animal {
void makeSound();
}
// 具体动物
class Lion implements Animal {
public void makeSound() {
System.out.println("Lion is roaring");
}
}
class Elephant implements Animal {
public void makeSound() {
System.out.println("Elephant is trumpeting");
}
}
class Dolphin implements Animal {
public void makeSound() {
System.out.println("Dolphin is squeaking");
}
}
// 动物工厂接口
interface AnimalFactory {
Animal createAnimal();
}
// 具体动物工厂
class LionFactory implements AnimalFactory {
public Animal createAnimal() {
return new Lion();
}
}
class ElephantFactory implements AnimalFactory {
public Animal createAnimal() {
return new Elephant();
}
}
class DolphinFactory implements AnimalFactory {
public Animal createAnimal() {
return new Dolphin();
}
}
public class Main {
public static void main(String[] args) {
AnimalFactory lionFactory = new LionFactory();
AnimalFactory elephantFactory = new ElephantFactory();
AnimalFactory dolphinFactory = new DolphinFactory();
Animal lion = lionFactory.createAnimal();
Animal elephant = elephantFactory.createAnimal();
Animal dolphin = dolphinFactory.createAnimal();
lion.makeSound();
elephant.makeSound();
dolphin.makeSound();
}
}
在这个案例中,AnimalFactory
是超级工厂接口,每个具体的动物工厂类如LionFactory
、ElephantFactory
和DolphinFactory
都实现了这个接口。通过不同的工厂,我们可以创建不同种类的动物。
3.3 优缺点
- 优点:
- 更高层次的封装:超级工厂模式将多个工厂模式结合在一起,提供更高层次的封装和抽象。
- 根据条件选择:根据不同条件选择合适的子工厂来创建对象,增加了灵活性和可扩展性。
- 满足开闭原则:当新增工厂或产品时,不需要修改已有代码,符合开闭原则。
- 缺点:
- 复杂性增加:超级工厂模式会引入更多的工厂类,可能会增加系统的复杂性。
- 不同工厂间的耦合:超级工厂模式可能会导致不同工厂之间的耦合,影响系统的维护和扩展。
4. 总结
工厂模式是面向对象设计中的重要模式之一,它能够将对象的创建和使用分离,提高代码的灵活性和可维护性。通过简单工厂模式、抽象工厂模式和超级工厂模式,我们可以根据不同的需求来选择合适的模式来创建对象。在实际开发中,根据具体情况选择合适的工厂模式可以使代码更加模块化、可扩展和易于维护。