当前位置: 首页 > news >正文

1.1(设计模式)工厂模式

 工厂模式:

工厂模式通过工厂创建对象,用户无需注意内部细节,只需要调用工厂类,

将需要创建的类名称传递给工厂即可。

采用工程类创建,最后返回的是接口类型,所以只用关心接口,不用关心接口的具体实现类。

 

Shape接口

public interface Shape {
    public void draw();
}

 

实现Shape接口的具体类:

public class Circle implements Shape{

    @Override
    public void draw() {
        System.out.println("draw circle");
    }  
}

 

public class Rectangle implements Shape{

    @Override
    public void draw() {
        System.out.println("draw rectangle");
    }
}

 

public class Square implements Shape{

    @Override
    public void draw() {
        System.out.println("draw square");
    }
}

 

ShapeFactory工厂:

public class ShapeFactory {
    public Shape getShape(String shape) {//传递图像字符串,根据字符串判断并实例化对应对象
        if("circle".equals(shape)) {
            return new Circle();
        }else if("rectangle".equals(shape)) {
            return new Rectangle();
        }else if("square".equals(shape)) {
            return new Square();
        }
        return null;
    } 
}

 

Main调用ShapeFactory实例化对象

public class Main {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shape circle = shapeFactory.getShape("circle"); 
        circle.draw();
    }
}
运行结果:
draw circle

 

 

ShapeFatory中采用if else,当工厂中类多了后采用if else不易于扩展,且代码结构复杂不好分析。

故将图形用枚举类型代替,结合switch代替if else.

 

图形枚举

public enum ShapeEnum {
    CIRCLE,RECTANGLE,SQUARE
}

 

ShapeFactory

public class ShapeFactory {
    public Shape getShape(ShapeEnum shape) {
        switch(shape) {
        case CIRCLE:       return new Circle();
        case RECTANGLE:    return new Rectangle();
        case SQUARE:    return new Square();
        default : try {//没有找到指定类型则抛出ClassNotFound异常
                throw new ClassNotFoundException();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return null;
    } 
}

 

Main

public class Main {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shape circle = shapeFactory.getShape(ShapeEnum.CIRCLE); 
        circle.draw();
    }
}
运行结果:
draw circle

 

参考资料:

http://www.runoob.com/design-pattern/factory-pattern.html

转载于:https://www.cnblogs.com/huang-changfan/p/10692258.html

相关文章:

  • Redis 桌面管理工具 RedisDesktopManager 2019.0 发布
  • nginx统计日志中客户端ip访问次数
  • MGR实现分析 - 成员管理与故障恢复实现
  • Android性能优化之内存优化
  • Vmware10中Centos7挂载Windows主机的共享文件夹,提示:Error: cannot mount filesystem: No such device...
  • 如何优化代码中大量的if/else,switch/case?
  • 浏览器的渲染原理简介
  • webpack(2)
  • [ZJOI2019]语言
  • 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...
  • LeetCode--047--全排列 II(java)
  • Javascript 模块化指北
  • Hadoop高可用原理及环境搭建
  • BBS项目
  • 【轻松一刻】Java制作字符动画
  • [PHP内核探索]PHP中的哈希表
  • 2019年如何成为全栈工程师?
  • CentOS7简单部署NFS
  • Effective Java 笔记(一)
  • java8 Stream Pipelines 浅析
  • Python语法速览与机器学习开发环境搭建
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 记录:CentOS7.2配置LNMP环境记录
  • 检测对象或数组
  • 跳前端坑前,先看看这个!!
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一个完整Java Web项目背后的密码
  • 用Python写一份独特的元宵节祝福
  • 原生 js 实现移动端 Touch 滑动反弹
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Java并发新构件之Exchanger
  • ​ubuntu下安装kvm虚拟机
  • ​香农与信息论三大定律
  • # 计算机视觉入门
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)(1.9) MSP (version 4.2)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ZT)薛涌:谈贫说富
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (分类)KNN算法- 参数调优
  • (六)软件测试分工
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)mysql使用Navicat 导出和导入数据库
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .Mobi域名介绍
  • .NET 5种线程安全集合
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net(C#)常用转换byte转uint32、byte转float等