循序渐进学设计模式(一)
编程本身并没有什么设计模式,只是在需求的驱动下,大家采用某一种方式去解决问题,后来总结经验发现某一种方式可以解决一类特定问题。
这些经验就形成了五花八门的设计模式。
此博文仅是跟人学习笔记与心得,特与各位分享,如有不足之处还望不吝指出。
需求:“自给自足的樵夫砍柴”
分析:对象:樵夫、工具。方法:砍柴。
没有涉及模式
抽象出人类接口
interface human { }
抽象出工具接口
public interface Tool { }
樵夫处在自给自足时代,想要砍柴还要自己造把斧头(好在樵夫知道如何去造一把斧头【兼职铁匠的说】)
public class Woodcutter implements Human{ //既然是个人,总是要有个称呼的,比如“老王”之类的 private String name ; public Woodcutter(String name) { this.name = name; } /** * 至少能够告诉别人你叫啥 * @return 姓名 */ public String getName() { return name; } /** * 祖传制作斧头方法 * */ private interface Axe extends Tool { void cut(); } /** * 樵夫的砍柴方法 */ public void sCutWood() { //砍柴之前总要有把斧头,不去买智能自己造 Axe axe = new Axe() { @Override public void cut() { System.out.println("Cut wood!"); } }; axe.cut(); } public static void main(String[] args) { Woodcutter w = new Woodcutter("老王"); System.out.println(w.getName()); w.sCutWood(); } }
新需求:“老王发现隔壁铁匠铺的斧头比自己造的好使耐用,于是决定去买一把斧头砍柴”
分析:新增对象:铁匠铺,斧头
简单工厂类型
铁匠铺也算一个简单的工厂了,工厂自然是一个泛指,应该用泛型滴!
public interface Factory { <E> E produce(Class<E> clazz); }
老王家隔壁的铁匠铺也是经营着多种业务啊
public class Forge implements Factory { @Override public <E> E produce(Class<E> clazz) { E e = null; try { e = clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e1) { e1.printStackTrace(); } return e; } }
需要额外一个类来描述斧头了
public class Axe implements Tool{ /** * 斧头的功能 */ public void method() { System.out.println("用斧头砍"); } }
老王不再自己造斧头了
public class Woodcutter implements Human{ //既然是个人,总是要有个称呼的,比如“老王”之类的 private String name ; public Woodcutter(String name) { this.name = name; } /** * 至少能够告诉别人你叫啥 * @return 姓名 */ public String getName() { return name; } /** * 樵夫的砍柴方法 */ public void sCutWood() { //现在不想自己做,直接去铁匠铺买一把斧头 Factory f = new Forge(); //告诉铁匠想要买个砍树的工具,铁匠就造了一把斧头给他 Tool t = f.produce(Axe.class); //然后樵夫就使用这个工具去砍柴了 t.method(); } public static void main(String[] args) { Woodcutter w = new Woodcutter("老王"); System.out.println(w.getName()); w.sCutWood(); } }
需求就这样催生了简单的工厂模式