• 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.

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

    优点:

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

    使用场景

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

    工厂方法模式扩展

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

  • 相关阅读:
    Java Web(三) 会话机制,Cookie和Session详解(转载)
    如何转载别人的文章
    C#操作Word的+ CKEditor 輸出成Word文件(包含圖案上傳)
    vs2013 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”。是否缺少程序集引用?
    CKEditor与CKFinder学习--自定义界面及按钮事件捕获
    JS获取CkEditor在线编辑的内容
    <%#Eval() %>的常用方法
    ASP.NET 中 ContentType 类型
    富文本编辑器 CKeditor 配置使用+上传图片
    VS2013 蛋疼的“AJAX Control Toolkit”安装过程
  • 原文地址:https://www.cnblogs.com/zfc2201/p/3423662.html
Copyright © 2020-2023  润新知