设计模式——简单工厂模式

定义:

  简单工厂模式是一个由工厂来确定创建某种产品的实例。

  先看一个简单的例子 

package com.zr.pattern.simpleFactory;

import java.util.Scanner;

/**
 * 实现计算机控制台程序,要求输入两个数和运算符得到运算结果
 * @author zr
 */
public class Calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数");
        String firstNumber = scanner.nextLine();
        System.out.println("请输入第二个数");
        String secondNumber = scanner.nextLine();
        System.out.println("请输入运算符");
        String operator = scanner.nextLine();
        String result = "";
        try {
            switch (operator) {
            case "+":
                result = Double.valueOf(firstNumber) + Double.valueOf(secondNumber) + "";
                break;
            case "-":
                result = Double.valueOf(firstNumber) - Double.valueOf(secondNumber)+ "";
                break;
            case "*":
                result = Double.valueOf(firstNumber) * Double.valueOf(secondNumber)+ "";
                break;
            case "/":
                if(Double.valueOf(secondNumber) != 0){
                    result = Double.valueOf(firstNumber) / Double.valueOf(secondNumber)+ "";
                }else {
                    System.out.println("除数不能为零");
                }
                break;
            }
            System.out.println("运算结果是:" + result);
        } catch (NumberFormatException e) {
            System.out.println("输入的不是数字");
        }
    }
}

  这个程序满足功能是没有问题,只是用计算机的思路来表述和解决问题。比如这个程序先输入一个数,在输入一个数,然后根据输入的运算符号获得结构,确实是满足了计算机的需求,但是这种程序。不容易扩展,不容易维护,不容易复用。

  可维护:指的是如果要改,只需更改要改的的地方。比如说上面的程序我改加法 ,很可能不小心把减法的逻辑改了。

  可扩展:指的是如果要加东西,直接加就行了,原来的代码不用动。如果上面的程序我要加个开根的功能。在switch下加分支,那么这个程序会越来越臃肿。有可能会加出毛病来。

  可复用:代码重用。如果别的地方地方需要加减乘除的功能,上述代码完全不能用。耦合度太高了。有的人可能认为把计算的代码复制过去就行了。这不叫复用,这叫复制。如果程序里面相同的代码有很多万一,某个逻辑错了,改起来是不是很痛苦,也有可能改出问题。

面向对象的设计:继承、封装、多态

  可以通过继承、封装、多态来把程序的耦合度降到最低。上面的计算机程序就是 输入、输出、计算全部都在一个方法里面耦合度太高

   封装:将业务方法抽出来。定义一个接口只有一个方法,获得运算结果

package com.zr.pattern.simpleFactory;

public interface Operator {
	public void getResult();
}

  继承:实现这个接口,这样就容易维护和扩展,修改加法 不会影响到减法, 增加一个开根的功能,只需要实现上述的接口,而不需要修改原来的代码。

 1 /**
 2  * 加法类
 3  * @author zr
 4  */
 5 public class OperatorAdd implements Operator{
 6     public double firstNumber = 0;
 7     public double secondNumber = 0;
 8
 9     public OperatorAdd(double firstNumber, double secondNumber) {
10         this.firstNumber = firstNumber;
11         this.secondNumber = secondNumber;
12     }
13
14     @Override
15     public void getResult() {
16         double result = Double.valueOf(firstNumber) + Double.valueOf(secondNumber);
17         System.out.println("运算结果是:" + result);
18     }
19 }
20
21
22 /**
23  * 减法类
24  * @author zr
25  */
26 public class OperatorSub implements Operator{
27     public double firstNumber = 0;
28     public double secondNumber = 0;
29
30     public OperatorSub(double firstNumber, double secondNumber) {
31         this.firstNumber = firstNumber;
32         this.secondNumber = secondNumber;
33     }
34
35     @Override
36     public void getResult() {
37         double result = Double.valueOf(firstNumber) - Double.valueOf(secondNumber);
38         System.out.println("运算结果是:" + result);
39     }
40 }
41
42 /**
43  * 乘法类
44  * @author zr
45  */
46 public class OperatorMul implements Operator{
47     public double firstNumber = 0;
48     public double secondNumber = 0;
49
50     public OperatorMul(double firstNumber, double secondNumber) {
51         this.firstNumber = firstNumber;
52         this.secondNumber = secondNumber;
53     }
54
55     @Override
56     public void getResult() {
57         double result = Double.valueOf(firstNumber) * Double.valueOf(secondNumber);
58         System.out.println("运算结果是:" + result);
59     }
60 }
61
62
63
64 /**
65  * 除法类
66  * @author zr
67  */
68 public class OperatorDiv implements Operator{
69     public double firstNumber = 0;
70     public double secondNumber = 0;
71
72     public OperatorDiv(double firstNumber, double secondNumber) {
73         this.firstNumber = firstNumber;
74         this.secondNumber = secondNumber;
75     }
76
77     @Override
78     public void getResult() {
79         if(Double.valueOf(secondNumber) != 0){
80             double result = Double.valueOf(firstNumber) / Double.valueOf(secondNumber);
81             System.out.println("运算结果是:" + result);
82         }else {
83             System.out.println("除数不能为零");
84         }
85     }
86 }

  多态:工厂类来实例化对象,通过返回父类的方式实现了计算结果。

package com.zr.pattern.simpleFactory;

public class OperatorFactory {
    public static Operator createrOperator(String operator, double first, double second){
        Operator o = null;
        switch (operator) {
        case "+":
            o = new OperatorAdd(first, second);
            break;
        case "-":
            o = new OperatorSub(first, second);
            break;
        case "*":
            o = new OperatorMul(first, second);
            break;
        case "/":
            o = new OperatorDiv(first, second);
            break;
        }
        return o;
    }
}

  客户端类:

public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数");
        String firstNumber = scanner.nextLine();
        System.out.println("请输入第二个数");
        String secondNumber = scanner.nextLine();
        System.out.println("请输入运算符");
        String operator = scanner.nextLine();
        //加法
        Operator o = OperatorFactory.createrOperator("+", Double.valueOf(firstNumber), Double.valueOf(secondNumber));
        o.getResult();
    }
}

这样设计计算器:

1、如果要修改加法,只需要修改OperatorAdd类,不会影响其他算法。

2、如果要增加其他的复杂运算,如平方根、立方根,只需要增加相应的子类,并修改工厂类增加switch分支。

这样就实现了 可维护、可扩展、易重用(加减乘除的算法完全可以单独调用)。

uml类图如下

时间: 2024-08-25 02:36:29

设计模式——简单工厂模式的相关文章

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s

PHP经典设计模式--简单工厂模式

PHP经典设计模式--简单工厂模式 pfinal介绍 本来我们要获取一个类的实例,需要用到new关键字.但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方. 工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例. 实现 SimpleFactory.php <?php namespace DesignPatterns

Python 设计模式--简单工厂模式

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul

C#设计模式——简单工厂模式

一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂模式的介绍 说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了?所有面向对象的编程都是在我们生活中存在的,从词义的解释就是我们生活中的工厂就是负责生产产品的,而到开发中对应的就是NEW不同的对象,该模式主要解决的问题就是解决创建对象与该类的解耦.设计原则中经常说的类单一职责.封装性都有体现.

3. 星际争霸之php设计模式--简单工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!============================================================================== 上次用星际争霸讨论了面向对象的基础知识

设计模式—简单工厂模式

设计模式之简单工厂模式 看书学习设计模式,书本来源<大话设计模式>,啃一啃怎么样设计程序 在"大话"这本书中写简单工厂模式用计算器为例来说明,其实是最简单的面向接口的编程思维,不依赖与具体的实现,而重点考虑接口.这是比较重要的思维上的转变. 重点: 1.通过继承,造成多态属性,然后在子类中实现父类的接口,在不同的子类中进行不同的接口实现.直接调用实现的接口方法得到最后的值,这一种思维够趣味 2.做增量,尽量不修改之前的,靠增加代码来更改需求 3.最通俗的说法,高内聚,低耦合

C# 设计模式 简单工厂模式

设计模式(C#版)--简单工厂模式 为什么要用设计模式? 1.设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上. 2.设计模式使程序易读.熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序. 3.设计模式能使编写的程序具有良好的可扩展性,满足系统设计的开闭原则.比如策略模式,就是将不同的算法封装在子类中,在需要添加新的算法时,只需添加新的子类,实现规定的接口,即可在不改变现有系统源码的情况下加入新的系统行为. 4.设计模式能降低系统中类与类之间的耦合度.比如工厂

JAVA 设计模式 简单工厂模式

用途 简单工厂模式 (Simple Factory) 又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例. 简单工厂模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 但是简单工厂模式不属于23种Gof设计模式之一. 结构 如何实现一个具有加减乘除基本功能的计算器? 对于这四种运算来说,都需要两个操作数,差别仅在于返回的结果不同. 由此,我们可以抽象化它们的共性,提炼出一个父类.这个类中包含