您好,登录后才能下订单哦!
在软件开发中,设计模式是解决常见问题的经典解决方案。工厂模式是创建型设计模式中的一种,主要用于对象的创建。工厂模式可以分为简单工厂模式、工厂方法模式和抽象工厂模式。本文将详细介绍这三种工厂模式的定义、实现方式以及各自的优缺点,并通过Java代码示例进行说明。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。
工厂模式属于创建型模式,主要用于对象的创建。工厂模式的核心思想是将对象的创建与使用分离,使得系统更加灵活、可扩展。
简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式(Static Factory Method Pattern),它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
下面通过一个简单的例子来说明简单工厂模式的实现。
假设我们有一个图形接口 Shape
,以及两个实现类 Circle
和 Rectangle
。我们需要一个工厂类 ShapeFactory
来根据传入的参数创建不同的图形对象。
// 图形接口
interface Shape {
void draw();
}
// 圆形类
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
// 矩形类
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
// 图形工厂类
class ShapeFactory {
// 使用 getShape 方法获取形状类型的对象
public Shape getShape(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 SimpleFactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
// 获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
}
}
优点:
缺点:
工厂方法模式(Factory Method Pattern)又称为虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern),它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。
下面通过一个例子来说明工厂方法模式的实现。
假设我们有一个日志记录器接口 Logger
,以及两个实现类 FileLogger
和 ConsoleLogger
。我们需要一个工厂接口 LoggerFactory
和两个具体的工厂类 FileLoggerFactory
和 ConsoleLoggerFactory
来创建不同的日志记录器对象。
// 日志记录器接口
interface Logger {
void log(String message);
}
// 文件日志记录器
class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("File Logger: " + message);
}
}
// 控制台日志记录器
class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.out.println("Console Logger: " + message);
}
}
// 日志记录器工厂接口
interface LoggerFactory {
Logger createLogger();
}
// 文件日志记录器工厂
class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new FileLogger();
}
}
// 控制台日志记录器工厂
class ConsoleLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
return new ConsoleLogger();
}
}
// 使用工厂方法模式创建对象
public class FactoryMethodPatternDemo {
public static void main(String[] args) {
LoggerFactory fileLoggerFactory = new FileLoggerFactory();
Logger fileLogger = fileLoggerFactory.createLogger();
fileLogger.log("This is a file log message.");
LoggerFactory consoleLoggerFactory = new ConsoleLoggerFactory();
Logger consoleLogger = consoleLoggerFactory.createLogger();
consoleLogger.log("This is a console log message.");
}
}
优点:
缺点:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂的模式。它属于对象创建型模式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
下面通过一个例子来说明抽象工厂模式的实现。
假设我们有一个图形接口 Shape
和颜色接口 Color
,以及它们的实现类 Circle
、Rectangle
、Red
和 Green
。我们需要一个抽象工厂接口 AbstractFactory
和两个具体的工厂类 ShapeFactory
和 ColorFactory
来创建不同的图形和颜色对象。
// 图形接口
interface Shape {
void draw();
}
// 圆形类
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
// 矩形类
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
// 颜色接口
interface Color {
void fill();
}
// 红色类
class Red implements Color {
@Override
public void fill() {
System.out.println("Inside Red::fill() method.");
}
}
// 绿色类
class Green implements Color {
@Override
public void fill() {
System.out.println("Inside Green::fill() method.");
}
}
// 抽象工厂接口
abstract class AbstractFactory {
abstract Shape getShape(String shapeType);
abstract Color getColor(String colorType);
}
// 图形工厂类
class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(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 getColor(String colorType) {
return null;
}
}
// 颜色工厂类
class ColorFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType) {
return null;
}
@Override
public Color getColor(String colorType) {
if (colorType == null) {
return null;
}
if (colorType.equalsIgnoreCase("RED")) {
return new Red();
} else if (colorType.equalsIgnoreCase("GREEN")) {
return new Green();
}
return null;
}
}
// 工厂生成器类
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;
}
}
// 使用抽象工厂模式创建对象
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
// 获取图形工厂
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
// 获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
// 获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
// 获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
// 获取 Red 的对象,并调用它的 fill 方法
Color color1 = colorFactory.getColor("RED");
color1.fill();
// 获取 Green 的对象,并调用它的 fill 方法
Color color2 = colorFactory.getColor("GREEN");
color2.fill();
}
}
优点:
缺点:
模式名称 | 定义 | 优点 | 缺点 |
---|---|---|---|
简单工厂模式 | 根据参数的不同返回不同类的实例 | 简单易用,解耦 | 扩展性差,职责过重 |
工厂方法模式 | 工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象 | 扩展性好,解耦 | 类的个数增加,抽象性增加 |
抽象工厂模式 | 围绕一个超级工厂创建其他工厂的模式 | 扩展性好,解耦 | 类的个数增加,抽象性增加 |
工厂模式是创建型设计模式中的一种,主要用于对象的创建。简单工厂模式、工厂方法模式和抽象工厂模式各有优缺点,适用于不同的场景。简单工厂模式适用于产品类较少且不经常变化的场景;工厂方法模式适用于产品类较多且需要扩展的场景;抽象工厂模式适用于产品族较多且需要扩展的场景。
在实际开发中,应根据具体需求选择合适的工厂模式,以提高代码的可维护性和可扩展性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。