Leetcode-设计模式

Posted 钢铁-程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode-设计模式相关的知识,希望对你有一定的参考价值。

设计模式

工厂模式

1、简单工厂模式(让一个工厂创建所有对象)

工厂模式缺点:

  • 让一个工厂类承担构建所有对象的职责,一是如果需要生产的产品过多,此模式会导致工厂类过于庞大,承担过多的职责,变成超级类。违背了单一职责原则
  • 二是当要生产新的产品时,必须在工厂类中添加新的分支。而开闭原则告诉我们:类应该对修改封闭。我们希望在添加新功能时,只需增加新的类,而不是修改既有的类,所以这就违背了开闭原则
public class FruitFactory 
    public Fruit create(String type) 
        switch (type) 
            case "苹果":
                AppleSeed appleSeed = new AppleSeed();
                Sunlight sunlight = new Sunlight();
                Water water = new Water();
                return new Apple(appleSeed, sunlight, water);
            case "梨子":
                return new Pear();
            default:
                throw new IllegalArgumentException("暂时没有这种水果");
        
    

2、工厂方法模式(每个产品有一个专属工厂)

虽然每个产品都有自己的工厂,但是还是满足单一职责和开闭原则的。

  • 1、如果苹果的生产过程需要修改时,只需修改苹果工厂,调用方不需要修改。梨子的生产过程需要修改时,只需修改梨子工厂。符合单一职责原则。
  • 2、当需要生产新的产品时,无需更改既有的工厂,只需要添加新的工厂即可。保持了面向对象的可扩展性,符合开闭原则。
public class User 
    private void eat()
        AppleFactory appleFactory = new AppleFactory();
        Fruit apple = appleFactory.create();
        PearFactory pearFactory = new PearFactory();
        Fruit pear = pearFactory.create();
        apple.eat();
        pear.eat();
    

3、抽象工厂模式(定义接口,提取出工厂的接口,使用时无需关心是哪个工厂类,适合横向扩展(新增工厂),不适合纵向扩展(新增功能))

提供接口,我们在创建时指定了具体的工厂类后,在使用时就无需再关心是哪个工厂类,只需要将此工厂当作抽象的 IFactory 接口使用即可。这种经过抽象的工厂方法模式被称作抽象工厂模式。

public class User 
    private void eat()
        IFactory appleFactory = new AppleFactory();
        Fruit apple = appleFactory.create();
        IFactory pearFactory = new PearFactory();
        Fruit pear = pearFactory.create();
        apple.eat();
        pear.eat();
    

实际上抽象工厂模式主要用于替换一系列方法。

例如将程序中的 SQL Server 数据库整个替换为 Access 数据库,使用抽象方法模式的话,只需在 IFactory 接口中定义好增删改查四个方法,让 SQLFactory 和 AccessFactory 实现此接口,调用时直接使用 IFactory 中的抽象方法即可,调用者无需知道使用的什么数据库,我们就可以非常方便的整个替换程序的数据库,并且让客户端毫不知情。

抽象工厂模式很好的发挥了开闭原则、依赖倒置原则,但缺点是抽象工厂模式太重了,如果 IFactory 接口需要新增功能,则会影响到所有的具体工厂类。所以抽象工厂模式适用于增加同类工厂这样的横向扩展需求,不适合新增功能这样的纵向扩展。

以上是关于Leetcode-设计模式的主要内容,如果未能解决你的问题,请参考以下文章

一筐梨子&一筐水果——协变性(covariant)

Oracle36WM_CONCAT 行转列

D: Divide the pears

Leetcode-设计模式

Php排序

学习wm.concat函数