在软件开发中,简单工厂模式和工厂方法模式是两种常用的创建型设计模式。尽管它们都用于创建对象,但它们的实现方式和应用场景有所不同。本文将详细探讨这两种模式的区别,帮助你更好地理解和应用它们。
简单工厂模式
简单工厂模式,又称静态工厂方法模式,它通过一个工厂类的静态方法,根据传入的参数来决定创建哪一种产品对象。
简单工厂模式的结构
- 工厂类(Factory Class):包含一个静态方法,根据传入的参数决定实例化哪个具体类。
- 产品类(Product Classes):具体的产品类实现相同的接口或继承相同的抽象类。
- 客户端(Client):通过调用工厂类的静态方法来获取产品对象,而不是直接创建对象。
简单工厂模式的示例
java
// 产品接口
public interface Shape {
void draw();
}
// 具体产品类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
// 工厂类
public class ShapeFactory {
public static Shape createShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Shape shape1 = ShapeFactory.createShape("CIRCLE");
shape1.draw();
Shape shape2 = ShapeFactory.createShape("RECTANGLE");
shape2.draw();
}
}
工厂方法模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。它使一个类的实例化延迟到其子类。
工厂方法模式的结构
- 抽象工厂类(Abstract Factory Class):定义一个抽象的工厂方法,让子类实现这个方法来创建产品对象。
- 具体工厂类(Concrete Factory Classes):实现抽象工厂类的工厂方法,实例化具体的产品对象。
- 产品类(Product Classes):具体的产品类实现相同的接口或继承相同的抽象类。
- 客户端(Client):通过调用具体工厂类的工厂方法来获取产品对象,而不是直接创建对象。
工厂方法模式的示例
java
// 产品接口
public interface Shape {
void draw();
}
// 具体产品类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
// 抽象工厂类
public abstract class ShapeFactory {
public abstract Shape createShape();
}
// 具体工厂类
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
Shape shape1 = circleFactory.createShape();
shape1.draw();
ShapeFactory rectangleFactory = new RectangleFactory();
Shape shape2 = rectangleFactory.createShape();
shape2.draw();
}
}
区别
-
复杂度:
- 简单工厂模式:实现简单,只需要一个工厂类的静态方法。适用于产品种类较少、变化不频繁的情况。
- 工厂方法模式:结构复杂,需要定义抽象工厂类和多个具体工厂类。适用于产品种类较多、经常变化的情况。
-
扩展性:
- 简单工厂模式:不符合开闭原则(Open/Closed Principle),每次添加新产品都需要修改工厂类的代码。
- 工厂方法模式:符合开闭原则,添加新产品时只需添加新的具体工厂类,不需要修改现有代码。
-
灵活性:
- 简单工厂模式:客户端代码依赖于工厂类的静态方法,灵活性较差。
- 工厂方法模式:通过多态性实现,客户端代码可以动态选择使用哪个具体工厂类,灵活性更高。
选择哪种模式?
- 如果产品种类较少且变化不频繁,可以使用简单工厂模式,因为它实现简单且直观。
- 如果产品种类较多且经常变化,建议使用工厂方法模式,因为它具有更好的扩展性和灵活性。
抽象工厂模式与工厂方法模式的区别
在软件设计中,工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)都是创建型设计模式,它们都用于创建对象,但它们的实现方式和应用场景有所不同。本文将详细探讨这两种模式的区别,帮助你更好地理解和应用它们。
工厂方法模式
工厂方法模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。这样,工厂方法模式让类的实例化延迟到子类。
工厂方法模式的结构
- 抽象产品类(Abstract Product Class):定义产品的接口。
- 具体产品类(Concrete Product Classes):实现抽象产品接口。
- 抽象工厂类(Abstract Factory Class):定义一个创建产品对象的抽象方法。
- 具体工厂类(Concrete Factory Classes):实现抽象工厂类,具体化创建产品对象的方法。
示例
java
// 抽象产品接口
public interface Shape {
void draw();
}
// 具体产品类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
// 抽象工厂类
public abstract class ShapeFactory {
public abstract Shape createShape();
}
// 具体工厂类
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
Shape shape1 = circleFactory.createShape();
shape1.draw();
ShapeFactory rectangleFactory = new RectangleFactory();
Shape shape2 = rectangleFactory.createShape();
shape2.draw();
}
}
抽象工厂模式
抽象工厂模式提供一个接口,用于创建一系列相关或依赖对象的家族,而无需指定具体类。
关键在于客户端代码使用工厂时不需要关心具体的工厂和产品类是什么,而是通过工厂接口或抽象类来创建产品
抽象工厂模式的结构
- 抽象产品类(Abstract Product Classes):定义不同产品的接口。
- 具体产品类(Concrete Product Classes):实现抽象产品接口。
- 抽象工厂类(Abstract Factory Class):定义创建一组相关或依赖对象的接口。
- 具体工厂类(Concrete Factory Classes):实现抽象工厂接口,具体化创建一组相关或依赖对象的方法。
示例
java
// 抽象产品接口
public interface Shape {
void draw();
}
public interface Color {
void fill();
}
// 具体产品类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
public class Red implements Color {
@Override
public void fill() {
System.out.println("Filling with Red");
}
}
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Filling with Blue");
}
}
// 抽象工厂接口
public interface AbstractFactory {
Shape createShape(String shapeType);
Color createColor(String colorType);
}
// 具体工厂类
public class ShapeFactory implements AbstractFactory {
@Override
public Shape createShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
@Override
public Color createColor(String colorType) {
return null; // ShapeFactory 不负责创建颜色对象
}
}
public class ColorFactory implements AbstractFactory {
@Override
public Shape createShape(String shapeType) {
return null; // ColorFactory 不负责创建形状对象
}
@Override
public Color createColor(String colorType) {
if (colorType == null) {
return null;
}
if (colorType.equalsIgnoreCase("RED")) {
return new Red();
} else if (colorType.equalsIgnoreCase("BLUE")) {
return new Blue();
}
return null;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
Shape shape1 = shapeFactory.createShape("CIRCLE");
shape1.draw();
Shape shape2 = shapeFactory.createShape("RECTANGLE");
shape2.draw();
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
Color color1 = colorFactory.createColor("RED");
color1.fill();
Color color2 = colorFactory.createColor("BLUE");
color2.fill();
}
}
// 工厂生成器类
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if (choice.equalsIgnoreCase("SHAPE")) {
return new ShapeFactory();
} else if (choice.equalsIgnoreCase("COLOR")) {
return new ColorFactory();
}
return null;
}
}
工厂方法模式与抽象工厂模式的区别
-
产品维度:
- 工厂方法模式:关注的是单一产品对象的创建,适用于创建单一产品的场景。
- 抽象工厂模式:关注的是一组相关或互相依赖的产品对象的创建,适用于创建产品族的场景。
-
工厂接口的复杂度:
- 工厂方法模式:工厂接口只包含一个创建方法,负责创建一种产品对象。
- 抽象工厂模式:工厂接口包含多个创建方法,每个方法负责创建一种产品对象。
-
扩展性:
- 工厂方法模式:扩展新的产品时,只需增加新的具体工厂类,但扩展产品族会涉及较多修改。
- 抽象工厂模式:扩展新的产品族时,只需增加新的具体工厂类,无需修改现有代码,但扩展新的产品种类时,可能需要修改抽象工厂接口及其所有实现类。
-
应用场景:
- 工厂方法模式:适用于产品类型单一,且产品类的创建有较复杂的逻辑或要求延迟到子类的情况。
- 抽象工厂模式:适用于需要创建一组相关或互相依赖的产品对象,且需要保证这些对象的一致性的情况。
总结
工厂方法模式和抽象工厂模式都是用于创建对象的设计模式,但它们在复杂度和应用场景上有所不同。工厂方法模式适用于单一产品的创建,而抽象工厂模式适用于创建一组相关的产品对象。在实际开发中,选择合适的模式可以提高代码的灵活性和可维护性。希望通过这篇文章,你能更好地理解这两种模式,并在合适的场景中应用它们。