策略模式和工厂模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法或策略,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法独立于使用它的客户端而变化,这意味着你可以在不修改使用该算法的上下文代码的情况下更改算法。

如上图所示,将可能需要变动或具有多种实现方法的代码FlyBehavior定义为一个接口,然后就可以创建多个实现。通过在另一个接口实现类定义成员变量的方法将两种行为桥接在一起,这样在创建一个类对象时,通过传入指定的另一个类的实现类型来实现其行为类型。

工厂模式(Factory Pattern)是一种创建对象的设计模式,它提供了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这种模式对客户端隐藏了具体创建逻辑,使得代码更加灵活和可扩展。

简单工厂:是一种创建型设计模式,它通过一个工厂类来创建对象。这种模式并不是 GoF 设计模式中的一种,但它在软件开发中非常常见。简单工厂模式适用于对象创建较为简单且数量较少的场景。

优点:
简化对象创建:客户端只需调用工厂的静态方法,而不需要直接与具体产品类交互,简化了对象的创建过程。

集中管理:所有对象的创建逻辑集中在一个工厂中,方便管理和维护。

较易扩展:添加新产品时,只需在工厂中增加相应的创建逻辑,不需要修改现有代码(可能需要修改工厂类,但相对较少)。

缺点:
违反开闭原则:每次增加新产品时,都需要修改工厂类,可能导致代码的可维护性下降。

不支持多态性:如果产品数量过多或复杂,简单工厂模式可能会使工厂类变得庞大且难以管理

当对象的创建逻辑比较复杂,不只是简单的 new 一下就可以,而是要组合其他类对象,做各种初始化操作的时候,推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂、

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法将类的实例化推迟到子类中,这样可以使得代码更加灵活和可扩展。

这里以工厂方法模式为例,展示一个简单的应用示例。假设我们有一个文档阅读器应用,支持不同格式的文档(如PDF和DOCX),我们可以为每种文档格式定义一个解析器,并使用工厂模式来创建合适的解析器对象。

首先,定义抽象产品角色(DocumentParser接口)和具体产品角色(PdfParser和DocxParser类):

// 抽象产品角色
public interface DocumentParser {
    void parse(String filePath);
}

// 具体产品角色
public class PdfParser implements DocumentParser {
    @Override
    public void parse(String filePath) {
        System.out.println("Parsing PDF document: " + filePath);
    }
}

// 具体产品角色
public class DocxParser implements DocumentParser {
    @Override
    public void parse(String filePath) {
        System.out.println("Parsing DOCX document: " + filePath);
    }
}

然后,定义抽象工厂角色(DocumentParserFactory接口)和具体工厂角色(PdfParserFactory和DocxParserFactory类):

// 抽象工厂角色
public interface DocumentParserFactory {
    DocumentParser createParser();
}

// 具体工厂角色
public class PdfParserFactory implements DocumentParserFactory {
    @Override
    public DocumentParser createParser() {
        return new PdfParser();
    }
}

// 具体工厂角色
public class DocxParserFactory implements DocumentParserFactory {
    @Override
    public DocumentParser createParser() {
        return new DocxParser();
    }
}

最后,在应用程序中使用这些组件:

public class Main {
    public static void main(String[] args) {
        String filePath = "example.pdf";
        
        DocumentParserFactory factory;
        if (filePath.endsWith(".pdf")) {
            factory = new PdfParserFactory();
        } else if (filePath.endsWith(".docx")) {
            factory = new DocxParserFactory();
        } else {
            throw new IllegalArgumentException("Unsupported file format");
        }

        DocumentParser parser = factory.createParser();
        parser.parse(filePath);
    }
}
  • 解耦代码:客户端不需要知道它所使用的对象是如何被创建和组装的,因为这些都是由具体工厂负责的。
  • 易于扩展:如果需要添加新产品,只需编写相应的具体产品类以及对应的具体工厂类即可,无需修改现有代码,符合开闭原则。
  • 集中管理对象创建逻辑:将对象的创建逻辑集中在工厂类中,便于管理和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值