23种设计模式之--工厂方法模式
先讲个故事:
女娲造人,很多人都应该听过这个故事。
故事是这样的:首先,女娲采集黄土捏成人的形状,然后到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时会发生:
第一次烤泥人,感觉应该熟了,往大地一放,哇,没烤熟!于是一个白人诞生了。
第二次烤泥人,上一次没烤熟,这次多烤一会儿,放到世间一看,嘿,熟过头了,于是黑人诞生了。
第三次烤泥人,一边烧制一边察看,直到表皮微黄,嘿,刚好,于是黄色人种诞生了。
我们画EA图,模拟一下这个过程:
public interface Human { void getColor(); void talk(); } public class BlackHuman implements Human { public void getColor() { System.out.println("black"); } public void talk() { System.out.println("BlackHuman talking."); } } public class WhiteHuman implements Human { public void getColor() { System.out.println( "white" ); } public void talk() { System.out.println( "WhiteHuman talking." ); } } public class YellowHuman implements Human { public void getColor() { System.out.println( "yellow" ); } public void talk() { System.out.println( "YellowHuman talking." ); } }
public abstract class AbstractHumanFactory { public abstract <T extends Human> T createHuman(Class<T> clazz); } public class HumanFactory extends AbstractHumanFactory { @Override public <T extends Human> T createHuman( Class<T> clazz ) { Human human = null; try { human = (Human)Class.forName(clazz.getName()).newInstance(); } catch ( Exception e ) { System.out.println("create human error."); } return (T)human; } }
public class NvWa { public static void main( String[] args ) { AbstractHumanFactory yinyanglu = new HumanFactory(); Human blackhuman = yinyanglu.createHuman( BlackHuman.class ); blackhuman.getColor(); blackhuman.talk(); Human whiteHuman = yinyanglu.createHuman( WhiteHuman.class ); whiteHuman.getColor(); whiteHuman.talk(); Human yellowHuman = yinyanglu.createHuman( YellowHuman.class ); yellowHuman.getColor(); yellowHuman.talk(); } }
定义:
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
优点:
- 良好的封装性,代码结构清晰。
- 增加产品类时,只要扩展一个工厂类即可。
- 屏敝产品类的变化。
- 典型的解耦框架,符合里氏替换原则。
使用场景
- 工厂方法是new一个对象的替代品。
- 需要灵活的、可扩展的框架时,可以考虑使用。
- 可以用在异构项目中,但实际开发,会碰到很多问题。
- 可以用于TDD模式的开发。
工厂方法模式扩展
以上内容摘自《设计模式之禅》,需要了解细节的话,请自己下载书翻看。