一(1)简单工厂模式

1 设计模式中经常用到程序设计中的封装,继承,多态的思想。不同的设计模式使代码更加灵活,容易扩展。

2 设计模式中一般都会存在父类的概念,父类一般是抽象类,内部维护的变量,用于子类继承;维护的抽象方法,用于子类去具体实现。

3 对于一个方案的模式设计,要首先抽象出父类,想出父类中要维护哪些子类都要用到的变量;维护哪些子类都要去实现的方法。

扩展性的体现:主要体现在多态的实现部分,比如增加新的需求,要求可以计算a的b次幂,不需要动加减乘除的具体实现代码(类),只需要增加新类,去实现幂运算,在工厂类中,增加一个case语句即可。

解耦合的体现:不同的加减乘除具体实现方法通过不同的类来实现,这样它们之间基本没关联,实现解耦合。

本例子应用简单工厂的设计模式,返回不同的加减乘除运算类的对象。

package com.biao.factory.simplefactory;

/*
 *0 简单工厂类:根据传递的不同参数,通过多态,创建不同的对象,进行不同的运算操作。
 *1 可扩展:比如增加新的开方运算,只需要增加一个具体的运算类OperationSqur即可,不用更改原有代码,此为可扩展。
 *2 封装:比如不同的具体的运算类对于加减乘除的不同方法进行了封装,这样使加减乘除运算之间的耦合度降低。
 *3 继承:父类中定义变量,以及方法;子类去继承父类,用父类的变量,重写父类的方法,实现具体的运算。
 *4 多态:简单工厂类中,通过传递的不同参数,去创建不同的对象
 */
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        Operation operation = null;
        /*测试1*/
        operation = OperationFactory.createOperation("+");
        operation.numberA = 5;
        operation.numberB = 10;
        Double result = operation.getResult();
        System.out.println("result:"+result);
        /*测试2*/
        operation = OperationFactory.createOperation("/");
        operation.numberA = 15;
        operation.numberB = 3;
        Double result2 = operation.getResult();
        System.out.println("result:"+result2);
    }
}
/**
 * 1 内部维护两个操作数,用于进行运算
 * 2 内部维护一个返回结果的方法,用于子类重写,并返回子类特有的结果。
 * 3 这是一个父类。父类主要定义有哪些东西,具体如何操作,需要各个子类去实现。
 */
class Operation{
    public double numberA = 0;
    public 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 = 0d;
        return result;
    }
}
/**
 * 1 以下为具体的运算类,即加减乘除类。
 */
class OperationAdd extends Operation{
    public double getResult(){
        double result = 0d;
        result = numberA + numberB;
        return result;
    }
}
class OperationSub extends Operation{
    public double getResult(){
        double result = 0d;
        result = numberA - numberB;
        return result;
    }
}
class OperationMul extends Operation{
    public double getResult(){
        double result = 0d;
        result = numberA * numberB;
        return result;
    }
}
class OperationDiv extends Operation{
    public double getResult(){
        double result = 0d;
        if(numberB == 0){
            try {
                throw new Exception("除数为0");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            result = numberA/numberB;
        }
        return result;
    }
}
/**
 * 1 以下为运算符工厂类,通过多态,生成不同的运算类。
 *
 */
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;

        default:
            break;
        }
        return oper;
    }
}

如上demo的改进,改进运算操作的父类为一个抽象类,抽象类中维护两个操作数,用于进行计算,维护一个方法,用于返回计算结果。

代码如下:

package com.biao.factory.simplefactory.again;
/**
 * @改进:运算类更改为抽象类,抽象类中维护两个变量,(就是操作数,用于进行运算),还有一个抽象方法,
 *         用于子类继承重写,返回不同的运算结果。
 */
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        Operation oper;
        /*测试1*/
        oper = OperationFactory.createOperation("+");
        oper.NumberA = 1;
        oper.NumberB = 6;
        System.out.println(oper.getResult());
        /*测试2*/
        oper = OperationFactory.createOperation("/");
        oper.NumberA = 42;
        oper.NumberB = 6;
        System.out.println(oper.getResult());
    }

}

/*此类进行了改进*/
abstract class Operation{
    public double NumberA;
    public double NumberB;
    public abstract double getResult();
}

/*具体运算类*/
class OpetationAdd extends Operation{
    @Override
    public double getResult() {
        // TODO Auto-generated method stub
        return NumberA + NumberB;
    }
}
class OpetationSub extends Operation{
    @Override
    public double getResult() {
        // TODO Auto-generated method stub
        return NumberA - NumberB;
    }
}
class OpetationMul extends Operation{
    @Override
    public double getResult() {
        // TODO Auto-generated method stub
        return NumberA * NumberB;
    }
}
class OpetationDiv extends Operation{
    @Override
    public double getResult() {
        // TODO Auto-generated method stub
        double result =0;
        if(NumberB == 0){
            try {
                throw new Exception("除数为0");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            result = NumberA/NumberB;
        }
        return result;
    }
}

/*运算工厂生成类*/
class OperationFactory{
    public static Operation createOperation(String operate){
        Operation oper = null;
        switch (operate) {
        case "+":
            oper = new OpetationAdd();
            break;
        case "-":
            oper = new OpetationSub();
            break;
        case "*":
            oper = new OpetationMul();
            break;
        case "/":
            oper = new OpetationDiv();
            break;
        default:
            break;
        }
        return oper;
    }
}
时间: 2024-10-13 02:40:43

一(1)简单工厂模式的相关文章

简单工厂模式

目前正在看<大话设计模式>,写此系列的文章记录下学习的经过. 简单工厂模式 先看如下代码,使用面向对象的原理实现计算器功能 Operation运算类 1 public class Operation 2 { 3 private double numberA = 0; 4 private double numberB = 0; 5 6 public double NumberA 7 { 8 get { return numberA; } 9 set { numberA = value; } 10

大话设计模式:简单工厂模式

由于面向过程编程造成的代码膨胀问题越来越严重,使其维护的代价高,灵活性很低.为了使代码易维护.易扩展.易复用和灵活性好,所以我们在采用面向对象编程的时候,防止采用面向对象的语言实际上却做着面向过程的事儿,更需要采用某种设计模式,核心就是使程序变得高内聚,低耦合,这样的程序才能达到上面的四个优点.而简单工厂模式的出现也正是为了达到这样一种效果,将工厂和产品分块,具体解决了实例化那个对象(具体产品)的需求.从而实现了高内聚,低耦合.使程序易维护.易扩展.易复用和灵活性好.同时也用到了面向对象编程的三

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

简单工厂模式( Simple Factory Pattern )

1. 简单工厂模式( Simple Factory Pattern ) 1.1. 模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮.矩形按钮.菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式. 1.2

设计模式的C++实现 24.简单工厂模式

简单工厂模式,又称静态工厂模式,属于创造型模式,但又不是23中GOF设计模式之一.简单工厂是由一个工厂对象决定创造出哪种产品类的实例.简单工厂模式是工厂模式中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂通过传入的参数判断创建哪一个产品的实例,封装了对象的创建,客服端看到的只是产品的抽象对象,不关心返回子类的类型. 简单来说,简单工厂就是调用是传入一个参数来告诉工厂类要创建一个什么样的对象,然后工厂类返回这个对象. 缺点是 没添加一个产品子类,都要在工厂类中添加一个判断分支

【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下: #include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { retur

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

《大话设计模式》学习笔记系列--1. 简单工厂模式

简单工厂模式实现了一种"工厂"概念的面向对象设计模式,它可以在不指定对象具体类型的情况下创建对象.其实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化具体类.工厂方法让类的实例化推迟到子类中进行. 以书本上的计算器程序为例,其UML描述如下: 图中,AddOperator, SubtactOpertor继承算式基类Operator,而CreateOperator则是负责创建一个操作类,而不指明具体的子类类型. 下面,我们来看代码: 首先操作积累: /// <summa

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

设计模式(一)——简单工厂模式

嵌入式linux 设计模式(一)--简单工厂模式 一.简单工厂模式简介 1.简单工厂模式 简单工厂模式(Factory Method Pattern)是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 简单工厂模式的UML类图 工厂角色(Creator):是简单工厂模式的核心,由它负责创建所有的类的内部逻辑.工厂类必须能够被