zoukankan      html  css  js  c++  java
  • <五>读《《大话设计模式》》之工厂模式

     

            怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错。此工厂模式非彼工厂模式。

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

    还是以代码来进行比較吧

    1、操作接口。与简单工厂模式一样

    publicabstractclass Operation {

     

        publicdoublenumberA;

        publicdoublenumberB;

       

        publicabstractdouble getResult();

    }

    2、相加、相减类与简单工厂模式一样

    publicclass OperationAddextends Operation{

     

        publicdouble getResult(){

           returnnumberA +numberB;

        }

    }

    publicclass OperationSubextends Operation{

     

        publicdouble getResult(){

           returnnumberA -numberB;

        }

    }

    3、多了一个工厂接口

    publicinterface IFactory {

     

        OperationcreateOperation();

    }

    4、给每一个算法都建立一个工厂,有了这个工厂之后,每一个算法实例都分离开来,遵循了开闭原则。使代码结构更加清晰

    给加法、减法一个工厂

    publicclass AddFactoryimplements IFactory {

     

        public Operation createOperation() {

           //TODO Auto-generated method stub

           returnnew OperationAdd();

        }

     

    }

     

    publicclass SubFactoryimplements IFactory {

     

        public Operation createOperation() {

           //TODO Auto-generated method stub

           returnnew OperationSub();

        }

     

    }

    5有了这些工厂之后直接在client实例化想要的算法类就能够了(缺点耦合性差)

    publicclass FatoryClient {

     

        /**

         * @param args

         */

        publicstaticvoid main(String[] args) {

           //TODO Auto-generated method stub

     

           IFactoryfactory = new AddFactory();

           Operationoperation = factory.createOperation();

           operation.numberA = 3;

           operation.numberB = 2;

           double result = operation.getResult();

           System.out.println("相加结果:"+result);

          

           //我想调用还有一个实例。只在此newSubFactory()改动一下就能够了

           IFactoryfactory2 = new SubFactory();

           Operationoperation2 = factory2.createOperation();

           operation2.numberA = 3;

           operation2.numberB = 2;

           double result2 = operation2.getResult();

           System.out.println("相减结果:"+result2);

        }

    }

     

    与简单工厂模式比較

    比方我们要加一个算法:M的N次方,在简单工厂里面。我们先去加“M的N次方”功能类。然后去更改工厂方法,其中加case来推断调用。工厂模式呢,我们须要加“M的N次方”功能类,还要加该功能的工厂类,而且还要改client。看似麻烦了。事实上不然,简单工厂最大的长处是工厂类中包括了必要的逻辑推断。依据client的选择条件动态的实例化相关的类。对于client来说。去除了与详细产品的依赖。而工厂模式遵循了开闭原则。我加入业务需求不用改动原来的类的逻辑。直接加入新的逻辑就能够了。

    最后附上工厂模式类图:

    总结:工厂方法模式实现时,client须要决定实例化哪一个工厂来实现运算类,选择推断的问题还是存在的,也就是说。工厂方法把简单工厂的内部逻辑推断移到了client代码来实现,你想加功能,本来是改工厂类的,而如今改动client。

    附上源码:http://download.csdn.net/detail/jzhf2012/8095101

  • 相关阅读:
    基于jquery自己写滑动门(通用版)
    这一年,做为asp.net程序员我合格吗?
    基于jquery的滚动条滚动固定div(附Demo)
    asp.net获取数据随机显示(原创)
    为昨天一篇博文【asp.net,对于一个有点经验的猴子,我的要求高么?】做点解释
    2012年总结,2013年更精彩。
    放大镜
    be strong
    模拟凡客导航
    Ajax中Get请求与Post请求的区别(转载)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5251503.html
Copyright © 2011-2022 走看看