zoukankan      html  css  js  c++  java
  • 简单工厂模式的介绍、优缺点分析和解决方案

    所有的模式都是利用java中的封装、继承、多态这三个特性张开的,就像由这三个秘籍组成的各种变幻万千的招式,而所有的目的都是为了打败坏模式带来的代码垃圾这个敌人,所有的招式都是要求“可维护”、“可扩展”、“可复用”,当然如果达到这三个标准后,基本上“灵活性好”同时也就拥有了。 所以下面介绍最常用的工厂模式,分为三类:简单工厂模式、工厂模式和抽象工厂模式。

    一、简单工厂模式

    1.介绍

          工厂模式,顾名思义,最少有一个生产产品的机器存在的工厂Factory,与此同时,也要有一个构建好的产品模块Product。所以,我们要用到Factory来创造Product。在简单工厂模式中,有几种角色存在。一个是所有产品的父类P,即所有产品的模板;另外一个是继承了父类P的产品子类p1,p2...;当然,最重要的是Factory,在Factory中可以将这些的产品实例化,根据需求来将Factory和Product产生联系。

    2.例子 

          我们先来做一个例子吧,以做一个简单的计算器来开始。

        a.  Product的父类: Operation


    public class Operation {

        private double _numberA = 0 ;
        private double _numberB = 0;
        private double result = 0;
        public double get_numberA() {
            return _numberA;
        }
        public void set_numberA(double _numberA) {
            this._numberA = _numberA;
        }
        public double get_numberB() {
            return _numberB;
        }
        public void set_numberB(double _numberB) {
            this._numberB = _numberB;
        }
        public double getResult() {
            return result;
        }
        public void setResult(double result) {
            this.result = result;
        }
        
        
    }

     b.继承了Product的子类:加法产品(OperationAdd),乘法产品(OperationMul),减法产品(OperationSub),除法产品(OperationDiv)

    public class OperationAdd extends Operation{
        @Override
        public double getResult(){
            double result = 0;
            result = get_numberA() + get_numberB();
            return result;
        }
    }

    public class OperationSub extends Operation{

        @Override
        public double getResult(){
            double result = 0 ;
            result = get_numberA() - get_numberB();
            return result;
        }
    }

    public class OperationMul extends Operation {

        @Override
        public double getResult(){
            double result = 0;
            result = get_numberA()*get_numberB();
            return result;
        }
    }

    public class OperationDiv extends Operation{

        @Override
        public double getResult(){
            double result = 0 ;
            if(get_numberB() == 0){
                throw new RuntimeException("除数不能为0.");
            }else{
                result = get_numberA()/get_numberB();
                return result;
            }
           
        }
    }

     c.生产产品的工厂Factory(OperationFactory)

    package SimpleFactory;
    public class OperationFactory {

        public static Operation createOperation(String operate){
            Operation oper = null;
            switch(operate)
            {
            case "+" :
                oper = new OperationAdd() ;
                break;
            case "-" :
                oper = new OperationSub() ;
                break;
            case "*" :
                oper = new OperationMul() ;
                break;
            case "/" :
                oper = new OperationDiv() ;
                break;
            }
            return oper;
        }}

    最后我们把工厂和产品做好以后就可以,将产品买给客户啦。

    public class Client {

        public static void main(String[] args) {
            test();
        }
        
        public static void test(){
            Operation oper = OperationFactory.createOperation("+");
            oper.set_numberA(1);
            oper.set_numberB(2);
            double result = oper.getResult();
            System.out.println(result);
        }

    } 

    结果当然是:3.0啦。

     这就是最简单的工厂模式,说到优点,这个简单工厂用了java中继承,将决定工厂的生产什么产品的决定权直接交到了客户手中,然后客户在输入自己的需求,得到最终的结果。

    这样模块清晰化,每个部分都各司其职,分工明确,代码就实现最渐层意义上的“可维护”啦。说到缺点,当我们需要增加一产品,比如在计算机中加入一个新的功能,可以求M的N次方,这样个小功能我们就要去添加一个新的类,同时我们需要在Factory中改动到switch里面的代码,这是耦合性很高的表现啦,所以我们就有了“工厂模式”的出现啦。 

  • 相关阅读:
    C# checklistbox控件用法总结(怎样得到多选的值,以及动态加载数据)
    Tomcat service.xml详解
    修改windows服务器上面tomcat启动窗口的名称
    表空间
    安装selenium遇到的问题
    oracel 锁表查询
    Can not perform this action after onSaveInstanceState
    Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.HEADSET_PLUG
    Java.lang.IllegalStateException Activity has been destroyed
    StrictMode 使用
  • 原文地址:https://www.cnblogs.com/kgrdomore/p/4241706.html
Copyright © 2011-2022 走看看