目录
一、设计思路
1. 简单工厂模式
2. 工厂方法模式
3. 抽象工厂模式
二、UML类图(PlantUML格式)
1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式
三、实现过程与结果
1. 简单工厂模式
2. 工厂方法模式
3. 抽象工厂模式
四、总结
在面向对象设计中,工厂模式是一种常用的创建型设计模式,它通过将对象的创建逻辑集中管理,使得客户端无需直接创建对象,而是通过工厂类来获取所需的对象实例。这种设计思想不仅提高了代码的可扩展性和可维护性,还增强了系统的灵活性。本文将通过一个鼠标和键盘的商品对象创建系统,详细探讨简单工厂模式、工厂方法模式和抽象工厂模式的应用。
一、设计思路
1. 简单工厂模式
简单工厂模式通过一个统一的工厂类来创建对象,客户端通过传递类型参数来指定需要创建的对象。这种模式适合产品种类较少且不会频繁变化的场景。
-
鼠标接口:定义鼠标的基本行为。
-
具体鼠标类:实现无线鼠标和有线鼠标类,分别实现鼠标接口。
-
鼠标工厂类:根据传入的类型参数创建相应的鼠标对象。
2. 工厂方法模式
工厂方法模式通过定义一个抽象工厂接口,让具体的工厂类实现该接口来创建对象。客户端通过使用抽象工厂接口,而不直接调用具体工厂类。这种模式适合产品种类较多且可能频繁变化的场景。
-
鼠标接口:定义鼠标的基本行为。
-
具体鼠标类:实现无线鼠标和有线鼠标类。
-
抽象工厂接口:声明创建鼠标的方法。
-
具体工厂类:实现抽象工厂接口,分别创建无线鼠标和有线鼠标。
3. 抽象工厂模式
抽象工厂模式通过一个抽象工厂接口来创建多个相关的产品族。具体工厂实现该接口,生产一组相关的产品。这种模式适合需要创建多个相关产品族的场景。
-
鼠标接口:定义鼠标的基本行为。
-
键盘接口:定义键盘的基本行为。
-
具体产品类:实现无线鼠标、有线鼠标、无线键盘和有线键盘类。
-
抽象工厂接口:声明创建鼠标和键盘的方法。
-
具体工厂类:实现抽象工厂接口,分别创建无线设备(鼠标和键盘)和有线设备(鼠标和键盘)。
二、UML类图(PlantUML格式)
1.简单工厂模式
@startuml
interface Mouse {
+ make()
}
class WirelessMouse {
+ make()
}
class WiredMouse {
+ make()
}
class MouseFactory {
+ createMouse(type: String): Mouse
}
Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory --> Mouse
@enduml
2.工厂方法模式
@startuml
interface Mouse {
+ make()
}
class WirelessMouse {
+ make()
}
class WiredMouse {
+ make()
}
interface MouseFactory {
+ createMouse(): Mouse
}
class WirelessMouseFactory {
+ createMouse(): Mouse
}
class WiredMouseFactory {
+ createMouse(): Mouse
}
Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory <|.. WirelessMouseFactory
MouseFactory <|.. WiredMouseFactory
@enduml
3.抽象工厂模式
@startuml
interface Mouse {
+ make()
}
interface Keyboard {
+ make()
}
class WirelessMouse {
+ make()
}
class WiredMouse {
+ make()
}
class WirelessKeyboard {
+ make()
}
class WiredKeyboard {
+ make()
}
interface DeviceFactory {
+ createMouse(): Mouse
+ createKeyboard(): Keyboard
}
class WirelessDeviceFactory {
+ createMouse(): Mouse
+ createKeyboard(): Keyboard
}
class WiredDeviceFactory {
+ createMouse(): Mouse
+ createKeyboard(): Keyboard
}
Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
Keyboard <|.. WirelessKeyboard
Keyboard <|.. WiredKeyboard
DeviceFactory <|.. WirelessDeviceFactory
DeviceFactory <|.. WiredDeviceFactory
@enduml
三、实现过程与结果
1. 简单工厂模式
代码实现:
public interface Mouse {
void make();
}
public class WirelessMouse implements Mouse {
@Override
public void make() {
System.out.println("制造无线鼠标");
}
}
public class WiredMouse implements Mouse {
@Override
public void make() {
System.out.println("制造有线鼠标");
}
}
public class MouseFactory {
public Mouse createMouse(String type) {
if ("wireless".equalsIgnoreCase(type)) {
return new WirelessMouse();
} else if ("wired".equalsIgnoreCase(type)) {
return new WiredMouse();
} else {
return null;
}
}
}
public class Demo {
public static void main(String[] args) {
MouseFactory factory = new MouseFactory();
Mouse wirelessMouse = factory.createMouse("wireless");
Mouse wiredMouse = factory.createMouse("wired");
wirelessMouse.make(); // 输出:制造无线鼠标
wiredMouse.make(); // 输出:制造有线鼠标
}
}
2. 工厂方法模式
代码实现:
public interface Mouse {
void make();
}
public class WirelessMouse implements Mouse {
@Override
public void make() {
System.out.println("制造无线鼠标");
}
}
public class WiredMouse implements Mouse {
@Override
public void make() {
System.out.println("制造有线鼠标");
}
}
public interface MouseFactory {
Mouse createMouse();
}
public class WirelessMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new WirelessMouse();
}
}
public class WiredMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new WiredMouse();
}
}
public class Demo {
public static void main(String[] args) {
MouseFactory wirelessFactory = new WirelessMouseFactory();
MouseFactory wiredFactory = new WiredMouseFactory();
Mouse wirelessMouse = wirelessFactory.createMouse();
Mouse wiredMouse = wiredFactory.createMouse();
wirelessMouse.make(); // 输出:制造无线鼠标
wiredMouse.make(); // 输出:制造有线鼠标
}
}
3. 抽象工厂模式
代码实现:
public interface Mouse {
void make();
}
public interface Keyboard {
void make();
}
public class WirelessMouse implements Mouse {
@Override
public void make() {
System.out.println("制造无线鼠标");
}
}
public class WiredMouse implements Mouse {
@Override
public void make() {
System.out.println("制造有线鼠标");
}
}
public class WirelessKeyboard implements Keyboard {
@Override
public void make() {
System.out.println("制造无线键盘");
}
}
public class WiredKeyboard implements Keyboard {
@Override
public void make() {
System.out.println("制造有线键盘");
}
}
public interface DeviceFactory {
Mouse createMouse();
Keyboard createKeyboard();
}
public class WirelessDeviceFactory implements DeviceFactory {
@Override
public Mouse createMouse() {
return new WirelessMouse();
}
@Override
public Keyboard createKeyboard() {
return new WirelessKeyboard();
}
}
public class WiredDeviceFactory implements DeviceFactory {
@Override
public Mouse createMouse() {
return new WiredMouse();
}
@Override
public Keyboard createKeyboard() {
return new WiredKeyboard();
}
}
public class Demo {
public static void main(String[] args) {
DeviceFactory wirelessFactory = new WirelessDeviceFactory();
DeviceFactory wiredFactory = new WiredDeviceFactory();
Mouse wirelessMouse = wirelessFactory.createMouse();
Keyboard wirelessKeyboard = wirelessFactory.createKeyboard();
Mouse wiredMouse = wiredFactory.createMouse();
Keyboard wiredKeyboard = wiredFactory.createKeyboard();
wirelessMouse.make(); // 输出:制造无线鼠标
wirelessKeyboard.make(); // 输出:制造无线键盘
wiredMouse.make(); // 输出:制造有线鼠标
wiredKeyboard.make(); // 输出:制造有线键盘
}
}
四、总结
工厂模式的三种主要形式及其适用场景。每种模式都有其独特的优点和适用范围,合理选择和应用这些模式可以显著提升软件设计的质量和效率。
-
简单工厂模式:简单工厂模式以其简洁性和易于理解的特点,非常适合产品种类较少且相对稳定的场景。它通过一个统一的工厂类集中管理对象的创建逻辑,使得客户端代码更加简洁。然而,随着产品种类的增加,简单工厂类的条件判断逻辑可能会变得复杂,这可能会降低代码的可维护性。
-
工厂方法模式:工厂方法模式通过将对象的创建逻辑分散到多个具体的工厂类中,有效地解决了简单工厂模式在面对产品种类频繁变化时的扩展性问题。每个具体工厂类负责创建一种具体的产品,这使得系统在添加新产品时更加灵活,只需新增相应的工厂类而无需修改现有代码。这种模式特别适合产品种类较多且可能频繁变化的场景,它不仅提高了代码的可扩展性,还符合开闭原则,即对扩展开放,对修改关闭。
-
抽象工厂模式:抽象工厂模式在处理多个相关产品族的创建时表现出色。它通过一个抽象工厂接口定义了一组创建相关产品的方法,具体工厂实现这些方法来生产特定产品族中的产品。这种模式使得系统能够在不依赖具体产品实现的情况下,灵活地切换不同的产品族。这对于需要支持多种产品组合的系统来说是一个巨大的优势,它不仅提高了代码的可维护性,还增强了系统的灵活性和可扩展性。
在实际的软件开发中,选择合适的工厂模式需要综合考虑系统的复杂性、产品的种类和变化频率以及系统的扩展需求。简单工厂模式适合小型项目或产品种类较少的场景;工厂方法模式适用于产品种类较多且可能频繁变化的系统;而抽象工厂模式则更适合需要创建多个相关产品族的复杂系统。
此外,工厂模式的应用还体现了面向对象设计的核心原则,如封装、多态和依赖倒置等。通过将对象的创建逻辑封装在工厂类中,客户端代码可以依赖于抽象而非具体实现,这使得系统更加灵活,能够更好地应对需求的变化。
总之,工厂模式作为一种经典的创建型设计模式,为对象的创建提供了一种优雅的解决方案。它不仅能够提高代码的可读性和可维护性,还能够增强系统的扩展性和灵活性。在未来的软件设计中,合理运用工厂模式将有助于我们构建出更加健壮、灵活和易于维护的软件系统。