前言
为了写出更“优雅”的代码,遂准备来学习JAVA的设计模式。
以前从来没有写文章的习惯,发现学过的东西容易忘记,也可能是学的过于表面,不够深入,了解了费曼学习法,决定开始码文章,当作学习记录吧,也方便回顾。
设计模式
JAVA的设计模式分为三类,创建型模式(关注对象的创建机制)、结构性模式(关注类和对象之间的组合)、行为型模式(关注对象之间的通信以及责任的分配)
简单工厂模式
1 2 3 4 5 6 7 8 9 10 11 12 13
| public abstract class Fruit { protected final String name;
protected Fruit(String name) { this.name = name; }
@Override public String toString() { return name +"@"+hashCode(); } }
|
1 2 3 4 5 6 7
| public class Apple extends Fruit {
public Apple() { super("苹果"); } }
|
1 2 3 4 5 6 7 8
| public class Orange extends Fruit {
public Orange() { super("橘子"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class SimplefruitFactory { public static Fruit getFruit(String type) { switch (type) { case "苹果": return new Apple(); case "橘子": return new Orange(); default: return null; } } }
|
1 2 3 4 5 6
| public class Main { public static void main(String[] args) { Fruit fruit = SimplefruitFactory.getFruit("橘子"); System.out.println(fruit); } }
|
这样做的好处是,比如Apple的构造方法需要新的参数,我们只需要修改工厂里面的参数,因为其他地方是通过工厂获得的水果的实例。
假如现在需要增加一个新的水果类型,就需要对工厂进行修改。这不符合开闭原则。(开闭原则:一个软件实体,比如类、模块和函数应该对扩展开放,对修改关闭)。
工厂模式
1 2 3
| public abstract class FruitFactory <T extends Fruit>{ public abstract T getFruit(); }
|
1 2 3 4 5 6 7 8
| public class AppleFactora extends FruitFactory<Apple>{
@Override public Apple getFruit() { return new Apple(); } }
|
1 2 3 4 5 6
| public class Main { public static void main(String[] args) { Apple fruit = new AppleFactora().getFruit(); System.out.println(fruit); }
|
屏蔽了对象的创建细节,使用者只需要关心如何使用对象,降低了客户端与对象之间的耦合度。