Java23种设计模式
由于简单工厂模式违背了开闭原则,为了解决开闭原则的问题,我们引出今天的主角:工厂方法模式。
定义:为不同产品提供不同的工厂实现类,调用不同工厂实现类初始化不同工厂实例。
- 首先我们创Fruit接口:所有的水果只有一个方法tellme,调用就能知道水果的相关信息。
interface Fruit{ void tellMe(); }
- 水果有一个可选方法就是告诉客户怎么吃,所以创建一个工具类:
static class How{ String howToEat(String name){ if(name.equals("apple")){ return "削皮吃"; }else if(name.equals("banana")){ return "剥皮吃"; } return "不知道什么水果,不知道怎么吃"; } }
- 创建苹果工厂类,实现Fruit接口,内部可以实现告诉客户这是什么水果?怎么吃?
static class Apple implements Fruit{ @Override public void tellMe() { System.out.print("水果名为苹果\n"); String howToEat = new How().howToEat("apple"); System.out.print("吃法为:"+howToEat+"\n"); } }
- 客户调用:
打印结果:public static void main(String[] args) { new Apple().tellMe(); }
水果名为苹果 吃法为:削皮吃
- 如果我们又想要一个香蕉工厂呢?那么址需要添加一个Banana类:
static class Banana implements Fruit{ @Override public void tellMe() { System.out.print("水果名为香蕉\n"); String howToEat = new How().howToEat("banana"); System.out.print("吃法为:"+howToEat+"\n"); } } public static void main(String[] args) { new Banana().tellMe(); }
- 打印结果:
水果名为香蕉 吃法为:剥皮吃
上面例子可以看出来:
- 我们只是调用了Apple工厂这个类的tellMe方法,工厂自动告诉了我们水果名和吃法,我们不需要知道具体的过程,有时候也不需要知道具体结果,实现了调用者和工厂内部功能的完全分离。
- 如果我们需要知道香蕉的详细信息,那么Apple工厂就不能满足我们的需求了,我们需要再创建一个Banana工厂,这就是工厂方法模式。
总结优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
4、解决了简单工厂模式违背开闭原则的问题。