教你如何一篇博客读懂设计模式之—--工厂模式

一篇博客读懂设计模式之—工厂模式

工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式。

主要过程是: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

工厂模式主要有常见的三种类型:简单工厂模式,工厂方法模式,抽象工厂模式。下面我们分别用代码来介绍一下这三种模式的演化过程:

简单工厂模式

  1. 添加一个接口
public interface Car {String getBrand();
}
  1. 添加几个实现类实现接口
public class Bmw implements Car {@Overridepublic String getBrand() {return "BMW";}
}
public class Benz implements Car {@Overridepublic String getBrand() {return "Benz";}
}
public class Audi implements Car{@Overridepublic String getBrand() {return "Audi";}
}
  1. 添加一个方法来选择创建的对象
//todo:1 简单工厂模式,虽然代码很简单,但是一个工厂怎么可能生产这么多不同的产品,不太符合规律,所以有了工厂方法模式
public class SimpleFactory {public Car getCar(String name){if("BMW".equalsIgnoreCase(name)){return new Bmw();}else if("Benz".equalsIgnoreCase(name)){return new Benz();}else if("audi".equalsIgnoreCase(name)){return new Audi();}else{return null;}}
}
  1. 添加测试类:
public class TestSimpleFactory {public static void main(String[] args) {SimpleFactory simpleFactory = new SimpleFactory();Car car = simpleFactory.getCar("");System.out.println(car.getBrand());}
}

工厂方法模式:

  1. 添加一个工厂的接口
//todo:2 工厂方法模式,通过接口来实现,不过这有个不足,我们消费者得自己知道用哪个工厂来进行生产
public interface Factory {Car getCar();
}
  1. 实现接口的工厂类
public class AudiFactory implements Factory {@Overridepublic Car getCar() {return new Audi();}
}
public class BenzFactory implements Factory {@Overridepublic Car getCar() {return new Benz();}
}
public class BmwFactory implements Factory{@Overridepublic Car getCar() {return new Bmw();}
}
  1. 测试类:
public class TestFuncFactory {//这种模式也有点问题,工厂模式的好处是让使用者更加方便,但是这种模式还要我们知道是要用哪个工厂来创建,这也太不智能了吧,所以就有了抽象工厂public static void main(String[] args) {System.out.println(new BenzFactory().getCar());System.out.println(new BmwFactory().getCar());System.out.println(new AudiFactory().getCar());}
}

抽象工厂方法: 整合了前面两种模式

  1. 添加一个抽象工厂
//todo:3. 抽象工厂方法模式,利用抽象类来实现,综合了工厂方法和简单工厂方法两种模式的优缺点
public abstract  class AbstractFactory {abstract Car getCar();public Car getCar(String name){if("BMW".equalsIgnoreCase(name)){return new BmwFactory().getCar();}else if("Benz".equalsIgnoreCase(name)){return new BenzFactory().getCar();}else if("audi".equalsIgnoreCase(name)){return new AudiFactory().getCar();}else{return null;}}
}
  1. 添加一个默认实现类
//因为抽象类不能直接实例化,所以这里添加了一个默认类来实现抽象类的其他方法
public class DefaultFactory extends AbstractFactory {@OverrideCar getCar() {return new BenzFactory().getCar();}
}
  1. 测试类
public class TestAbstrFactory {public static void main(String[] args) {DefaultFactory defaultFactory = new DefaultFactory();System.out.println(defaultFactory.getCar("bmw"));}
}

**

后期会继续完善 欢迎留言点赞!!

**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jackson快速入门

引言 上一篇博客《XML模板解析————Dom4j解析xml案例分析》简单讲解了关于xml模板的解析,使用到了dom4j,这篇文章其实算是个姊妹篇,都是对于目前工作中的一些任务,如xml、json相互解析所涉及到的知识。 但是相对于xml而言&am…

一篇文章读懂MySQL的各种联合查询

一篇文章读懂MySQL的各种联合查询 联合查询是指将两个或两个以上的表的数据根据一定的条件合并在一起! 联合查询主要有以下几种方式: 全连接:将一张表的数据与另外一张表的数据彼此交叉联合查询出来 举例如下: 先建两张表: CR…

Class.forName()、Class.class、getClass() 区别

问:简单谈谈你对 Java 中 Class.forName()、Class.class、getClass() 三者的理解? Class.class 的形式会使 JVM 将使用类装载器将类装入内存(前提是类还没有装入内存),不做类的初始化工作,返回 Class 对象…

教你如何一篇博客读懂设计模式之—--原型模式

教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他们的地址也…

Java反射————Method根据方法名称字符串调用方法

引言 之前浏览廖雪峰老师的个人博客网站,无意间发现了关于在Java8中获取参数的方法,随手一转《Java 8中获取参数名称》,没想到今天遇到一个功能,非常符合这种反射调用的使用场景。回看了这篇之前转载的文章,然后根据自…

一篇文章看懂@Scheduled定时器/@Async/CompletableFuture

一篇文章看懂Scheduled定时器/Async/CompletableFuture Scheduled注解解析: 1.cron:最重要的一个参数 cron表达式[秒] [分] [小时] [日] [月] [周] [年]([年]可省略) 简单了解一下,网上有现成的工具 示例&#xff…

一篇搞懂HTTP协议

本文转自 :flyhero 码上实战《一个HTTP打趴80%面试者》 HTTP协议简介 HTTP(超文本传输协议)是应用层上的一种客户端/服务端模型的通信协议,它由请求和响应构成,且是无状态的。(暂不介绍HTTP2) 协议&…

注册gmail邮件,遇到“此电话号码无法用于进行验证”该怎么办

注册gmail邮件,遇到“此电话号码无法用于进行验证”该怎么办? 跟浏览器语言的设置有关,将语言改为英文即可,亲测有效!

Jackson高级操作————节点树

引言 继《Jackson快速入门》基础篇之后的树模型相关操作。 节点树模型 ObjectMapper构建JsonNode节点树,类似于DOM解析器的XML。 Testpublic void testJsonTree() throws JsonProcessingException, IOException {String jsonString "{\"name\":\…

spring源码分析第一天------源码分析知识储备

spring源码分析第一天------源码分析知识储备 Spring源码分析怎么学? 1、环境准备; 2、思路 看:是什么? 能干啥 想:为什么? 实践:怎么做? 调试的时候,完全可以在…

Jackson高级操作————流式API与JsonGenerator、JsonParser

引言 继《Jackson快速入门》之后的高级相关操作。 Jackson提供了一种对于性能要求应用程序操作json更加高效的方式——流式API,这种方式开销小,性能高,因此,如果应用程序或者程序逻辑对于性能有一定要求,可以使用这种…

Mysql高级教程思维导图

Mysql高级教程思维导图 1、思维导图总览: 2、MySQL架构介绍: 2.1、MySQL简介 2.2、MySQL Linux版安装 2.3、MySQL配置文件 2.4、MySQL逻辑架构介绍 2.5、MySQL存储引擎 2.6、MySQL的用户和权限管理 2.7、MySQL一些杂项配置 ’ 3、索引优化分析 3.1、性…

Eclipse(STS 4)闪退导致EGit插件异常

引言 到目前为止,STS已经闪退过三次了。 问题很棘手,我需要冷静。 首先出现了一个问题就是,EGit无法commit。 第二个问题是切换分支报错。 闪退重启后EGit无法提交代码 观察闪退出现的时机,一般出现在我 commit 代码的时候&…

spring源码分析第二天------spring系统概述以及IOC实现原理

1、Spring5 概述 Spring 是一个开源的轻量级 Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架, 其目的是用于简化企业级应用程序开发。 Spring 框架除了帮我们管理对象及其依赖关系,还提供像通…

Linux进阶之路————Linux概述

引言 Linux是一个开源、免费的操作系统。学习Linux知识分为以下几个阶段: 第一阶段:Linux环境下的基本操作命令,包括文件操作命令(rm、mkdir、chmod、chown)编辑工具使用(vi、vim)Linux用户管…

spring源码分析第三天------spring核心IOC容器和依赖注入原理

基于XML的依赖注入 1、依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位、载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC 容器还没有对所管理的 Bean 进行依赖注入,依赖注入在以下两种情况 …

Linux进阶之路————远程登录与vim编辑器

远程登录 远程的Linux系统中,如果希望通过ssh协议登录,那么在Linux需要有一个sshd服务监听22端口,也就是说要想通过ssh登录远程linux,那么linux必须安装sshd服务,并开启。这是一个远程登录成功的前提。 vi、vim编辑器…

JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别

JavaWeb中监听器Listener过滤器filter拦截器interceptor区别 如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param–>listener–>filter–>servlet–>interceptor(指的是拦截器) 1.概念 context-param:就是一些需要初…

Linux进阶之路————开机、重启和用户登录注销

关机、重启命令 shutdown 命令: 1)shutdown -h now 立即关机 2)shutdown -h 1 1分钟之后关机 3)shutdown -r now 立即重启 reboot 命令,直接使用,表示立即重启 halt 命令&am…

spring源码分析第四天------springmvc核心原理及源码分析

spring源码分析第四天------springmvc核心原理及源码分析 1、基础知识普及 2、 SpringMVC请求流程 3、SpringMVC代码流程 4、springMVC源码分析 4.1 4.2 4.3 5、Spring MVC 的优化 补充: SpringMVC经典设计是handlerMapping,大家可以看一…