二十三种设计模式之工厂模式(含Java工厂模式的实现)
前言
工厂模式的核心本质就是减少了我们去new对象这样子的操作,工厂模式可以分为三种,简单工厂模式
,工厂方法模式
,抽象工厂模式
- 简单工厂模式
简单工厂模式本质上是违背开闭原则的,简单工厂模式把实例化的操作放到统一一个类里面,让这个类去决定创建哪种对象
- 工厂方法模式
工厂方法模式我觉得就是在简单工厂模式上加了一层,这样就能保证开闭原则了
- 抽象工厂模式
抽象工厂模式其实就是工厂的工厂,也就是一个超级工厂,他提供了一个抽象的工厂接口,他是所有工厂一般化的一种形态
传统模式
假如我们有一个饼干类,顾客想要买饼干,但是饼干有很多种,比如巧克力饼干,夹心饼干,压缩饼干等等
代码实现
//客户类
public class client {public static void main(String[] args) {//买一个巧克力饼干Cookie cookie = new ChocolateCookies();cookie.eatCookie();//买一个夹心饼干cookie = new CompressedCookie();cookie.eatCookie();//买一个压缩饼干cookie = new SandwichCookie();cookie.eatCookie();}
}
//公共饼干接口
public interface Cookie {public void name();public void eatCookie();}//夹心饼干实现
public class SandwichCookie implements Cookie{@Overridepublic void name() {System.out.println("夹心饼干");}@Overridepublic void eatCookie() {System.out.println("吃掉夹心曲奇");}}//压缩饼干实现
public class CompressedCookie implements Cookie{@Overridepublic void name() {System.out.println("压缩饼干"); }@Overridepublic void eatCookie() {System.out.println("吃掉压缩饼干"); }}
//巧克力饼干实现
public class ChocolateCookies implements Cookie{@Overridepublic void name() {System.out.println("巧克力饼干"); }@Overridepublic void eatCookie() {System.out.println("吃掉巧克力饼干"); }
}
//吃掉巧克力饼干
//吃掉压缩饼干
//吃掉夹心曲奇
复制代码
简单工厂模式
我们可以看到在我们的Client类里面,我们多次使用了new,去生成不同的饼干,我们可以使用简单工厂模式去优化我们的代码,其实就是我们有一个饼干工厂,我们每次去买饼干都是从工厂中拿的。
为什么说简单工厂模式不符合开闭原则呢?
在简单工厂模式中,就比如上图,我还要加一个草莓饼干,这个时候,我们需要修改饼干工厂的代码,所以不符合开闭原则。
代码实现
这里只把饼干工厂类的代码放在这里,饼干的实现类并没有改变
//客户类
public class client {public static void main(String[] args) {Cookie cookie = CookieFactory.getCookie("巧克力");cookie.eatCookie();cookie = CookieFactory.getCookie("夹心");cookie.eatCookie();cookie = CookieFactory.getCookie("压缩");cookie.eatCookie();}
}
//饼干工厂类
public class CookieFactory {public static Cookie getCookie(String cookieName){if("巧克力".equals(cookieName)){return new ChocolateCookies();}else if("夹心".equals(cookieName)){return new SandwichCookie();}else if("压缩".equals(cookieName)){return new CompressedCookie();}else{return null;}}
}
//吃掉巧克力饼干
//吃掉夹心曲奇
//吃掉压缩饼干
复制代码
工厂方法模式
其实我觉得工厂方法模式就是在简单工厂模式加了一层,这样就符合了开闭原则
代码实现
我们可以看到工厂方法模式的代码十分冗余,虽然他符合了开闭原则,但是我们在日常开发中很少使用它。
//客户类
public class client {public static void main(String[] args) {Cookie cookie = new ChocolateFacotry().getCookie();cookie.eatCookie();cookie = new SandwichFactory().getCookie();cookie.eatCookie();cookie = new CompressedFactory().getCookie();cookie.eatCookie();}
}
//饼干工厂
public interface FacotryMehtod {Cookie getCookie();
}
//夹心饼干工厂
public class SandwichFactory implements FacotryMehtod{@Overridepublic Cookie getCookie() {return new SandwichCookie();}}
//压缩饼干工厂
public class CompressedFactory implements FacotryMehtod{@Overridepublic Cookie getCookie() {return new CompressedCookie();}}
//巧克力饼干工厂
public class ChocolateFacotry implements FacotryMehtod{@Overridepublic Cookie getCookie() {return new ChocolateCookies();}}
复制代码
抽象工厂模式
对于抽象工厂模式,是一种一般化工厂的一种形态,就比如,联想的工厂肯定不仅仅只生产电脑,小米的工厂也不仅仅只生产电脑,他肯定还有其他的,其实我觉得抽象工厂模式更像是一种产品族的概念
就像这种,我们的抽象工厂只提供一些基本工厂的一些形态
代码实现
//客户类
public class client {public static void main(String[] args) {PhoneProduct phone = new XiaomiFactory().getPhoneProduct();//从小米工厂买手机phone.SendSMS();phone.callUp();PhoneProduct phone2 = new LianXiangFactory().getPhoneProduct();//从联想工厂买手机phone2.SendSMS();phone2.callUp();ComputerProduct computer = new XiaomiFactory().getComputerProduct();//从小米工厂买电脑computer.work();computer.game();ComputerProduct computer2 = new LianXiangFactory().getComputerProduct();//从联想工厂买电脑computer2.work();computer2.game();}
}
//统一工厂
public interface abstractFactory {PhoneProduct getPhoneProduct();ComputerProduct getComputerProduct();
}
//联想工厂
public class LianXiangFactory implements abstractFactory{@Overridepublic PhoneProduct getPhoneProduct() {return new LianXiangPhone();}@Overridepublic ComputerProduct getComputerProduct() {return new LianXiangComputer();}}
//小米工厂
public class XiaomiFactory implements abstractFactory{@Overridepublic PhoneProduct getPhoneProduct() {return new XiaomiPhone();}@Overridepublic ComputerProduct getComputerProduct() {return new XiaomiComputer();}}
//统一电脑接口
public interface ComputerProduct {void work();void game();
}
//统一手机接口
public interface PhoneProduct {void callUp();void SendSMS();
}
//联想电脑
public class LianXiangComputer implements ComputerProduct{@Overridepublic void work() {System.out.println("使用联想电脑办公"); }@Overridepublic void game() {System.out.println("使用联想电脑玩游戏"); }}
//联想手机
public class LianXiangPhone implements PhoneProduct{@Overridepublic void callUp() {System.out.println("使用联想手机打电话");}@Overridepublic void SendSMS() {System.out.println("使用联想手机发短信");}}
//小米电脑
public class XiaomiComputer implements ComputerProduct{@Overridepublic void work() {System.out.println("使用小米电脑办公"); }@Overridepublic void game() {System.out.println("使用小米电脑玩游戏"); }}
//小米手机
public class XiaomiPhone implements PhoneProduct{@Overridepublic void callUp() {System.out.println("使用小米手机打电话");}@Overridepublic void SendSMS() {System.out.println("使用小米手机发短信");}}
//使用小米手机发短信
//使用小米手机打电话
//使用联想手机发短信
//使用联想手机打电话
//使用小米电脑办公
//使用小米电脑玩游戏
//使用联想电脑办公
//使用联想电脑玩游戏
复制代码
总结
对于工厂模式,我们了解了三种工厂模式的实现,以及与传统模式的不同,我们可以看到的是,除了简单工厂模式,另外两种工厂模式代码十分的冗余,所以在实际的开发中,我们也是很少使用的,虽然简单工厂模式他并不满足开闭原则,但是他实现起来更方便呀,相较于传统模式,我们也不用去new一个又一个对象了,所以简单工厂模式在实际的开发用的是比较多的!
二十三种设计模式之工厂模式(含Java工厂模式的实现)相关推荐
- 第二部分:二十三种设计模式解读——什么是工厂方法模式
二十三种设计模式解读--什么是工厂方法模式 author:陈镇坤27 日期:2022年2月10日 修改日期:2022年6月23日 文章目录 二十三种设计模式解读--什么是工厂方法模式 一.工厂方法模式 ...
- 二十三种设计模式(第十二种)-----代理模式(Proxy)
二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...
- 二十三种设计模式之原型模式
今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...
- Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式
Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...
- 二十三种设计模式-六大原则
二十三种设计模式 一.创建型: 单例模式.工厂模式.抽象工厂模式.原型模式.建造者模式: 二.结构型: 代理模式,装饰器模式.适配器模式.外观模式.组合模式.享元模式.桥梁模式: 三.行为型: 策略模 ...
- 深入理解常见的二十三种设计模式
深入理解常见的二十三种设计模式 文章目录 深入理解常见的二十三种设计模式 一.设计模式的分类 1.1 创建型(五种) 1.2 结构型(七种) 1.3 行为型(十一种) 二.创建型 2.1 单例模式 2 ...
- Java二十三种设计模式 之代理(proxy)
Java二十三种设计模式 之代理(proxy) 今天我们学习一下静态代理和动态代理 我们来看代码(写一个坦克运行了多少时间): 第一种方法: public calss Tank implements ...
- 二十三种设计模式第二篇--工厂模式
上篇我们了解了6条设计模式的准则,我相信如果你想了解设计模式,那么你迈出的第一步,我会将上一篇文档里边的6大准则进行一篇有关的代码展示,当然这是题外话了,本篇我们将重点围绕工厂模式进行讲解,天哪,23 ...
- Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...
- java二十三种设计模式——工厂设计模式
java设计模式的分类 在java中,设计模式有三十三种之多,分为三大类: 创建性模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构性模式,共七种:适配器模式.装饰器模式 ...
最新文章
- 慎用Outline ,UGUI Outline实现原理分析
- CentOS系统更换软件安装源yum
- 集合数百个常用工具类集合,V2.3.10.104
- 全国计算机一级考试介绍难不难,全国计算机一级考试内容 计算机一级考试难吗...
- 081、Weave Scope 多主机监控(2019-04-29 周一)
- Java Servlet教程– ULTIMATE指南(PDF下载)
- 神奇的datetime和datetime,一毫秒引发的血案
- Android的Wifi系统框架分析第一篇
- C语言解释器的实现--让脚本跑起来(六)
- HTML——超链接、音视频
- 区块链+电子档案解决方案
- 一. Scala安装与环境配置
- 安卓手机屏幕在电脑上实时同步显示
- Shell脚本初学习
- 高盛报告引科技股暴跌 但如今并非 互联网泡沫2.0
- 微信公众号开发 - 配置表设计以及接入公众号接口开发
- 赚钱套路分享:降维打击,报团取暖的玩法
- Linux 驱动开发 五:Linux LED驱动开发
- 修改迅雷下载链接的方法。
- matlab exm,exm 《Experiments with MATLAB》这本书的程序源码,附中文注释,简单易懂,是学习 238万源代码下载- www.pudn.com...