首页 > 技术文章 > 23种设计模式之--工厂方法模式

zfc2201 2013-11-14 17:01 原文

先讲个故事:

女娲造人,很多人都应该听过这个故事。

故事是这样的:首先,女娲采集黄土捏成人的形状,然后到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时会发生:

第一次烤泥人,感觉应该熟了,往大地一放,哇,没烤熟!于是一个白人诞生了。

第二次烤泥人,上一次没烤熟,这次多烤一会儿,放到世间一看,嘿,熟过头了,于是黑人诞生了。

第三次烤泥人,一边烧制一边察看,直到表皮微黄,嘿,刚好,于是黄色人种诞生了。

我们画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.

      定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

 

 

优点:

  1. 良好的封装性,代码结构清晰。
  2. 增加产品类时,只要扩展一个工厂类即可。
  3. 屏敝产品类的变化。
  4. 典型的解耦框架,符合里氏替换原则。

 

使用场景

  1. 工厂方法是new一个对象的替代品。
  2. 需要灵活的、可扩展的框架时,可以考虑使用。
  3. 可以用在异构项目中,但实际开发,会碰到很多问题。
  4. 可以用于TDD模式的开发。

工厂方法模式扩展

 

 

 

 

 

以上内容摘自《设计模式之禅》,需要了解细节的话,请自己下载书翻看。

推荐阅读