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-设计模式的主要内容,如果未能解决你的问题,请参考以下文章