精华内容
下载资源
问答
  • 简单工厂
    2022-02-07 21:59:54

    场景

    今天遇到一个面试题,题目为“C++、Java、或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果”。

    问题分析

    通常面对这样的问题,会心有成竹、下笔有神,心想写一个简易的计算机控制程序还不简单吗?不就是输入数字,在输入符号,最后得出结果。但是这个题目真的只是考验这个逻辑吗?所有的编程初学者都会有这样的问题,就是碰到问题就直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和符号,然后根据运算符号判断选择如何运算,得到结果,这个本身没有错误,但是这样的思维却使我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。为了达到可维护、可扩展、可复用的目的我们选用简单工厂模式。

    解决方案

    新建运算类

    运算类中包含两个数字及一个方法。

    package com.qqkj.design.demo1.entity;
    
    /**
     * 运算类
     * @author hgq
     */
    public class Operation {
    
        private double numberA = 0;
    
        private double numberB = 0;
    
        public double getNumberA() {
            return numberA;
        }
    
        public void setNumberA(double numberA) {
            this.numberA = numberA;
        }
    
        public double getNumberB() {
            return numberB;
        }
    
        public void setNumberB(double numberB) {
            this.numberB = numberB;
        }
    
        public double getResult(){
            double result = 0;
            return result;
        }
    }
    
    

    新建加法类使之继承运算类

    package com.qqkj.design.demo1.entity;
    
    /**
     * 加法类
     * @author hgq
     */
    public class OperationAdd extends Operation{
    
        @Override
        public double getResult() {
            double numberA = super.getNumberA();
            double numberB = super.getNumberB();
            return numberA + numberB;
        }
    }
    
    

    新建减法类使之继承运算类

    package com.qqkj.design.demo1.entity;
    
    /**
     * 减法类
     * @author hgq
     */
    public class OperationSub extends Operation{
        @Override
        public double getResult() {
            double numberA = super.getNumberA();
            double numberB = super.getNumberB();
            return numberA - numberB;
        }
    }
    
    

    新建乘法类使之继承运算类

    package com.qqkj.design.demo1.entity;
    
    /**
     * 乘法类
     * @author hgq
     */
    public class OperationMul extends Operation{
        @Override
        public double getResult() {
            return super.getNumberA()*super.getNumberB();
        }
    }
    
    

    新建除法类使之继承运算类

    package com.qqkj.design.demo1.entity;
    
    /**
     * 乘法类
     * @author hgq
     */
    public class OperationDiv extends Operation{
        @Override
        public double getResult() {
            double result = 0;
            double numberA = super.getNumberA();
            double numberB = super.getNumberB();
            if(numberB == 0){
                throw new RuntimeException("除数不能为0");
            }else {
                result = numberA / numberB;
            }
            return result;
        }
    }
    
    

    新建运算工厂类

    package com.qqkj.design.demo1.entity;
    
    /**
     * 运算工厂类
     * @author hgq
     */
    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;
        }
    }
    
    

    新建测试类

    package com.qqkj.design.demo1.controller;
    
    import com.qqkj.design.demo1.entity.Operation;
    import com.qqkj.design.demo1.entity.OperationFactory;
    
    public class OperationTest {
        public static void main(String[] args) {
            Operation operation = OperationFactory.createOperation("+");
            operation.setNumberA(10);
            operation.setNumberB(11);
            double result = operation.getResult();
            System.out.println("结果为:"+result);
        }
    }
    
    

    总结

    还没想好。。。。。。。

    更多相关内容
  • 主要介绍了Java设计模式之工厂模式,结合实例形式分析了简单工厂工厂方法、抽象工厂等相关功能、实现与使用方法,需要的朋友可以参考下
  • python版简单工厂模式

    2020-12-25 16:53:14
    什么是简单工厂模式 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就...
  • 请用Java面向对象语言,利用简单工厂模式,实现简易计算器程序(加减乘除功能)。 在注释中回答以下问题: 1、 软件设计目标分别是什么? 2、 在相应的代码处解释设计目标实现的方式。
  • 运用两个典型案例,实现软件设计模式的简单工厂模式,从该案例中,可以体会简单工厂模式的特点
  • 如果一个后花园只种蔬菜类,那么就用简单工厂就可以了. 2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来. 3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当...
  • 主要介绍了js简单工厂模式用法,实例分析了javascript工厂模式的实现原理,需要的朋友可以参考下
  • 有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式;根据工厂的抽象程度可以分为 工厂方法模式 和 抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。...
  • NULL 博文链接:https://1193355343.iteye.com/blog/2370838
  • 工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮料和香蕉味饮料 <?php class ...
  • 简单工厂模式

    2018-03-06 14:16:32
    java设计模式 简单工厂模式详解 simple factory static pattern
  • 简单工厂模式 【静态工厂方法模式】(Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1、简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2、工厂方法模式(Factory ...
  • 本文实例讲述了JavaScript设计模式–简单工厂模式定义与应用。分享给大家供大家参考,具体如下: 一,介绍 工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。 工厂模式定义一个用于创建对象的接口...
  • 本文实例讲述了Python设计模式之简单工厂模式。分享给大家供大家参考,具体如下: 简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用...
  • JAVA简单工厂模式四则运算计算器
  • 设计模式——简单工厂模式

    千次阅读 2022-04-14 10:30:52
    简单工厂模式的简易实现

            简单工厂模式定义为:简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

            简单工厂模式结构图:

            

            简单工厂模式包含如下角色:

                    1.Factory(工厂角色)

                       工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。

                    2.Product(抽象产品角色

                      抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。

                    3.ConcreteProduct(具体产品类)

                      具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。

       

    下面通过一个简单的例子实现简单工厂模式。

             题目:使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。        

    1.未增加Robot之前的类图

    为了保证系统的扩展性并将各种人类型对象的创建封装在一个统一的方法中,引入一个person接口。

    Person是一个接口,其中包含了所有人都具有的业务方法create()。

     1.1未增加Robot之前

    Nvwa代码

    package simple_factory_pattern;
    
    public class Nvwa {
        public static Person getPerson(String person1) throws Exception
        {
            if (person1.equalsIgnoreCase("M")){
                return new Man();
            }
            else if (person1.equalsIgnoreCase("W")){
                return new Women();
            }else
            {
                throw new Exception("对不起,暂时无法创造该人。");
            }
        }
    }
    

     Person接口

    package simple_factory_pattern;
    
    public interface Person {
        public void create();
    }
    

    Man类

    package simple_factory_pattern;
    
    public class Man implements Person{
        @Override
        public void create() {
            System.out.println("成功创造了男人...");
        }
    }
    

    Women类

    package simple_factory_pattern;
    
    public class Women implements Person{
        @Override
        public void create() {
            System.out.println("成功创建了女人...");
        }
    }
    

    测试未增加Robot之前的代码:

    package simple_factory_pattern;
    
    public class Test {
        public static void main(String[] args) throws Exception {
            Person person;
            String person1 = "W";
            person = Nvwa.getPerson(person1);
            person.create();
        }
    }
    

    输出结果正常:

    2.增加Robot之后的类图

    2.1增加一个新的Robot类之后整体代码

    只是需要修改nvwa代码

    package simple_factory_pattern;
    
    public class Nvwa {
        public static Person getPerson(String person1) throws Exception
        {
            if (person1.equalsIgnoreCase("M")){
                return new Man();
            }
            else if (person1.equalsIgnoreCase("W")){
                return new Women();
            }else if (person1.equalsIgnoreCase("R")){
                return new Robot();
            }
            else
            {
                throw new Exception("对不起,暂时无法创造该人。");
            }
        }
    }
    

    以及新增一个Robbt类

    package simple_factory_pattern;
    
    public class Robot implements Person{
        @Override
        public void create() {
            System.out.println("成功创造了机器人...");
        }
    }
    

    测试输出Robot

    展开全文
  • 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。 1.工厂模式的几种形态 工厂模式专门负责将大量有共同接口的类实例化...
  • 利用简单工厂的设计模式,继承,封装,多态的方式完成的计算器
  • 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。 下面是一个简单工厂实例: def create_animal(name): if name == '...
  • 主要介绍了Java设计模式编程中简单工厂与抽象工厂模式的使用实例,简单工厂与抽象工厂都可以归类于设计模式中的创建型模式,需要的朋友可以参考下
  • 4.简单工厂-工厂方法-抽象工厂 对比总结
  • 简单工厂模式.zip

    2020-04-09 14:47:26
    本资源是设计模式>第2版,刘伟,简单工厂模式课后习题4、5的自己写的demo,如果有问题,请留言一起讨论
  • 介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
  • 简单工厂模式 应用

    2021-01-20 03:24:46
    简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 将“类实例...
  • 设计模式之简单工厂模式案例
  • NULL 博文链接:https://michael1990.iteye.com/blog/2111006
  • 1.简单工厂.rar,1.简单工厂,SimpleFactory,SimpleFactory,Program.cs,obj,SimpleFactory.csproj.nuget.dgspec.json,SimpleFactory.csproj.nuget.g.props,Debug,netcoreapp3.1,SimpleFactory.csproj....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 373,784
精华内容 149,513
关键字:

简单工厂

友情链接: regardz.zip