Java设计模式篇(三)--简单工厂模式详解_移动开发_网络编程_码蚁之家_www.codes51.com
返回首页
专题
网络编程
ASP教程 .NET教程 PHP教程 JSP教程 C#教程 Java教程 Delphi教程 VB教程 C/C++教程 Android开发 IOS开发 Windows Phone开发 Python教程 Ruby教程 移动开发 其他编程教程
网页制作
HTML教程 CSS教程 Dreamweaver教程 FrontPages教程 Javascript教程 web前端
数据库
SqlServer MySql Oracle Access DB2 SQLite 其他数据库
图形设计
photoshop教程 Fireworks教程 CorelDraw教程 Illustrator教程 AutoCad教程 FLASH教程
操作系统
Windows xp教程 Windows 7教程 Windows 8教程 Windows 2003教程 Windows Server 2008教程 Linux教程 Windows 10
网站运营
建站经验 SEO优化 站长心得 网赚技巧 网站推广 站长故事
手机学院
手机速递 安卓教程 iphone教程 手机评测 手机技巧 手机知识 手机应用 手机游戏 手机导购
网店宝典
开店指导 开店经验 网店装修 网店推广 网店seo 网购技巧
软件教程
办公软件 系统工具 媒体工具 压缩工具 图文处理 文件管理
范文之家
自我介绍 自我鉴定 写作模板 合同范本 工作总结 贺词祝福语 演讲致辞 思想汇报 入党申请书 实习报告 心得体会 工作计划 简历模板 工作报告 导游词 评语寄语 口号大全 策划书范文
信息工程
软件工程 企业开发 系统运维 软件测试
移民之家
移民动态 移民政策 移民百科 移民生活 技术移民 投资移民
知识大全
母婴 数码 摄影 装修 美文 常识 时尚 婚嫁 美食 养生 旅游 兴趣 职场 教育 文学 健康
问答大全
电脑网络 手机数码 QQ专区 生活 游戏 体育运动 娱乐明星 休闲爱好 文化艺术 社会民生 教育科学 健康医疗 商业理财 情感家庭 地区问题 其他
编程问答
IOS Android .NET Java C/C++ Delphi VC/MFC 其他语言 PHP MSSQL MYSQL Oracle 其他数据库 Web开发 Windows Linux 硬件/嵌入开发 网络通信 移动开发 云计算 企业IT 游戏开发
笑话大全
幽默笑话 爱情笑话 成人笑话 校园笑话 爆笑笑话 综合笑话 古代笑话 现代笑话 国外笑话

Java设计模式篇(三)--简单工厂模式详解

来源:互联网  时间:2018/10/31 7:12:30

在说简单工厂模式之前,我们先来了解下活字印刷术。

古时候没有现在这么现代化,都是先刻好印版,然后用印版将文章去印在纸上。每写一篇,都得刻一版,好累。

毕昇,是个头脑很灵活的工匠,他就在想,如果我把每个字都单独刻出来,你用的时候自己去组合,这样不就省事了,因此,一项伟大的发明就出现了---活字印刷术。

活字印刷术有4大特点:

第一,要改文章的字,只需要替换对应的字模就行,这是可维护。

第二,每个字模可以多次使用,这是可复用。

第三,如果文章中用到的字没有,可以新刻一个对应的字,这是可扩展。

第四,如果想改变文章的排版,只需要改变字模的方向就行,灵活性好。

我们在开发中,经常遇到用户改需求的时候,你是否很累?我们用了这么多年面向对象编程语言,多态,继承等降低了程序之间的耦合,但是一种好的组织形式是必不可少的,让你有章可循,这就是我们的设计模式。

在设计过程中,我们要将业务逻辑和系统逻辑分离开来,这样就不会因为业务需求的变动,而各种痛苦不堪。

我们先来一例,了解下简单工厂模式。

一、简单工厂模式

现在有一个需求,让你设计一个计算器。你怎么做?

首先我们知道,计算器中包含最基本的加减乘除,参与运算的是两个数值,一个运算符,一个结果,如1+1=2。

很多人说这个很简单,然后将一堆代码写在一个方法中,各种条件判断。如果我后期要新增或者修改呢?比如我要新增一个开根运算,你怎么办?继续在原有客户端方法中新增分支?要是改错了怎么办?系统立马就不能用了。这种的就是典型的紧耦合,典型的面向对象过程编程,我们要像毕昇学习,用活字印刷版的思路去做。

大多数人,碰到问题就直觉的按照计算机能够理解的逻辑去做开发,而没有真正的做到面向对象。

面向对象编程的三大特性:继承,封装,多态。封装,大多数人都有意识,可是多态这个利器却没有用起来。

我们说过,类是具有一组相同行为和属性的对象的抽象,分类的目的是为了封装。但是如果涉及到的类的

具有相同的行为,只是实现不一样,那就使用接口。如果涉及到的类具有相同的属性和行为,只是行为的实现不一样,那么就使用继承。

根据多态的特性,利用父类可以去代表子类,对外,可以统一使用父类去做操作。这里,我们的计算器操作需要两个数,行为相同实现不一样,因此可以使用继承实现多态。这样,我们的类图就有了。



我们先创建这几个类:

package com.zhaodf.pattern.simpleFactory;

public interface Operation {

    double getResult();
}
package com.zhaodf.pattern.simpleFactory;

public class OperationAdd implements Operation{
    private double numberA;
    private double numberB;

    public OperationAdd(double numberA,double numberB){
        this.numberA = numberA;
        this.numberB = numberB;
    }

    public double getResult() {
        return this.numberA+this.numberB;
    }

    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;
    }
}
package com.zhaodf.pattern.simpleFactory;

public class OperationDiv implements Operation{
    private double numberA;
    private double numberB;

    public OperationDiv(double numberA, double numberB){
        this.numberA = numberA;
        this.numberB = numberB;
    }

    public double getResult() {
        if(this.numberB==0){
            System.out.println("除数不能为0");
            return 0;
        }
        return this.numberA / this.numberB;
    }

    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;
    }
}
package com.zhaodf.pattern.simpleFactory;

public class OperationMul implements Operation{
    private double numberA;
    private double numberB;

    public OperationMul(double numberA, double numberB){
        this.numberA = numberA;
        this.numberB = numberB;
    }

    public double getResult() {
        return this.numberA * this.numberB;
    }

    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;
    }
}
package com.zhaodf.pattern.simpleFactory;

public class OperationSub implements Operation{
    private double numberA;
    private double numberB;

    public OperationSub(double numberA, double numberB){
        this.numberA = numberA;
        this.numberB = numberB;
    }

    public double getResult() {
        return this.numberA - this.numberB;
    }

    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;
    }
}

 基本类创建完了,我们现在需要一个根据计算要求统一生产这些类的地方---工厂,并且,我们使用父类作为统一对外的窗口,使客户端调用过程透明。

我们的工厂类如下:

package com.zhaodf.pattern.simpleFactory;

public class OperationFactory{
    //我们用1-代表加法,2-代表减法,3-代表乘法,4-代表除法
    public static Operation createOperation(double numberA,double numberB,int operationType){
        Operation op = null;
        switch (operationType){
            case 1:
                op = new OperationAdd(numberA,numberB);
                break;
            case 2:
                op = new OperationSub(numberA,numberB);
                break;
            case 3:
                op = new OperationMul(numberA,numberB);
                break;
            case 4:
                op = new OperationDiv(numberA,numberB);
                break;
        }
        return op;
    }
}

客户端调用代码:

package com.zhaodf.pattern.simpleFactory;

public class TestOperation {
    public static void main(String[] args){
        double numberA = 1;
        double numberB = 2;
        Operation op = OperationFactory.createOperation(numberA,numberB,1);
        System.out.println(op.getResult());
    }
}

二、总结

简单工厂模式,将创建运算对象过程放在了工厂类中,并且使用面向对象编程的特性-多态,将运算对象的父类作为统一对外的窗口。这里也有个不好的地方,就是虽然简化了客户端的代码,但是工厂类中创建对象的分支也需要维护,后面我们讲到反射时,再来修改此处。


上一篇Java设计模式中软件的设计原则篇
下一篇Java设计模式篇(五)--适配器模式详解
明星图片
相关文章
《 Java设计模式篇(三)--简单工厂模式详解》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)