一 工厂方法模式

1.解决的问题

将创建具体类的工作统一交给工厂来做,别的类概不负责。

2.类图

3.对应类图源码

/*** 蛋糕接口 */
public interface Cake {}/*** 奶油蛋糕*/
public class CreamCake implements Cake {}/*** 水果蛋糕*/
public class FruitCake implements Cake {}/*** 蛋糕工厂*/
public class CakeFactory {/** 创建水果蛋糕*/public Cake createFruitCake(){return new FruitCake();}/** 创建奶油蛋糕*/public Cake createCreamCake(){return new CreamCake();}
}/***客户端调用*/public class Client {public static void main(String[] args) {CakeFactory factory = new CakeFactory();Cake fruitcake = factory.createFruitCake();Cake creamCake = factory.createCreamCake();}
}

4.变体:静态工厂方法

将工厂中的方法修改为静态的,则变体为静态工厂方法。
/*** 蛋糕工厂*/
public class CakeFactory {/** 创建水果蛋糕*/public static Cake createFruitCake(){return new FruitCake();}/** 创建奶油蛋糕*/public static Cake createCreamCake(){return new CreamCake();}
}/***客户端调用*/
public class Client {public static void main(String[] args) {Cake fruitcake = CakeFactory.createFruitCake();Cake creamCake = CakeFactory.createCreamCake();}
}

二 抽象工厂模式

1.解决的问题

在遵守开闭原则的情况下,使用工厂方法,可以动态的创建新的产品而不需要改动工厂类。

2.类图

3.对应类图源码

注:蛋糕、水果蛋糕、奶油蛋糕与工厂方法相同。
/*** 蛋糕工厂*/
public interface AbstractCakeFactory {/** 制造蛋糕*/public Cake makeCake();
}/*** 水果蛋糕工厂*/
public class FruitCakeFactory implements AbstractCakeFactory {@Overridepublic Cake makeCake() {/** 创建水果蛋糕*/return new FruitCake();}
}/*** 奶油蛋糕工厂*/
public class CreamCakeFactory implements AbstractCakeFactory {@Overridepublic Cake makeCake() {/** 创建奶油蛋糕*/return new CreamCake();}
}public class Client {public static void main(String[] args) {//想要水果蛋糕,先造一个水果蛋糕工厂,制出来的就是水果蛋糕AbstractCakeFactory fruitfactory = new FruitCakeFactory();fruitfactory.makeCake();//想要奶油蛋糕,先造一个奶油蛋糕工厂,制出来的就是奶油蛋糕AbstractCakeFactory creamfactory = new CreamCakeFactory();creamfactory.makeCake();}
}

三 单例模式

1.解决的问题

让整个系统中只有一个实例,就像一个国家只能有一个皇帝。

2.源码一(双重锁检查写法)

/*** 皇帝单例*/
public class Emperor {//构造器私有private Emperor(){}//实例私有private static Emperor instance;public static Emperor getEmperor(){if(null == instance){synchronized(instance){if(null == instance){instance = new Emperor();}}}return instance;}
}

注:也有人把同步块抽取出一个方法来,这里不加赘述。

3.源码二(内部类写法)

/*** 皇帝单例*/
public class Emperor {//构造器私有private Emperor(){}//私有内部类private static class EmperorVoter{private static Emperor instance = new Emperor();}public static Emperor getEmperor(){return EmperorVoter.instance;}
}

4.源码三(枚举写法)

/*** 皇帝单例*/
public enum Emperor {INSTANCE
}

四 建造者模式

1.解决的问题

使用建造者可以实现产品的定制化功能。

2.类图

3.源码

/*** 可定制的蛋糕 */
public class ChosenCake {//豆沙private String dousha;//水果块private String shuiguo;public String getDousha() {return dousha;}public void setDousha(String dousha) {this.dousha = dousha;}public String getShuiguo() {return shuiguo;}public void setShuiguo(String shuiguo) {this.shuiguo = shuiguo;}
}/*** 蛋糕制作者*/
public interface CakeMaker {/** 加豆沙*/public void addDousha();/** 加水果块儿*/public void addShuiguo();/** 交付蛋糕*/public ChosenCake finishCake();
}/*** 蛋糕师傅*/
public class CakeMaster implements CakeMaker {//默认制作一个什么都不加的蛋糕private ChosenCake cake = new ChosenCake();@Overridepublic void addDousha() {cake.setDousha("按您的要求加入了===豆沙===");}@Overridepublic void addShuiguo() {cake.setShuiguo("按您的要求加入了===水果块儿===");}@Overridepublic ChosenCake finishCake(){return cake;}
}/*** 客人*/
public class Guest {public static void main(String[] args) {//选一个蛋糕师傅CakeMaker maker = new CakeMaster();//给我加点儿豆沙maker.addDousha();//给我加点儿水果块maker.addShuiguo();//把蛋糕给我吧ChosenCake cake = maker.finishCake();}
}

五 原型模式

1.解决的问题

不同程度的来复用已有的对象(深复用、潜复用)。

2.类图

3.对应类图源码

/*** 开保险箱的方法*/
public interface OpenBox extends Cloneable{/** 告诉你密码你就可以开(浅复制)*/public Object getPassword();/** 配钥匙才可以开(深复制) */public Object copyKey();
}/*** 会开保险箱的人 */
public class BoxOpener implements OpenBox{/** 浅复制,相当于你知道密码了,大家使用的都是同一串密码*/@Overridepublic Object getPassword() {BoxOpener opener = null;try {opener = (BoxOpener)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return opener;}/** 深复制,相当于你配了一把钥匙,用的不是一个东西*/@Overridepublic Object copyKey() {BoxOpener opener = null;try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);opener = (BoxOpener) ois.readObject();} catch (Exception e) {e.printStackTrace();}return opener;}
}/*** 测试流程*/
public class Test {public static void main(String[] args) {//保险箱有一个管理者OpenBox boxKeeper = new BoxOpener();//领导要开保险箱(浅复制)OpenBox leader = (OpenBox)boxKeeper.getPassword();//来了一个新管理员,配把钥匙(深复制)OpenBox newKeeper = (OpenBox)boxKeeper.copyKey();}
}

六 适配器模式

1.解决的问题

用来消除由于接口不匹配所造成的类的兼容性问题。

2.类扩展适配器

3.类扩展适配器源码

public class TriphaseBoard {/** 有三相插口*/public boolean hasTriphase(){System.out.println("==三相插板自带三相输出==");return true;}
}/*** 多功能插口*/
public interface MultiSocket {/** 有三相插口*/public boolean hasTriphase();/** 有两相插口*/public boolean hasTwoPhase();
}public class MultiPhaseBoard extends TriphaseBoard implements MultiSocket{/** 有两相插口*/public boolean hasTwoPhase(){System.out.println("==多功能插板实现两口的功能==");return true;}
}/*** 测试流程*/
public class Test {public static void main(String[] args) {MultiSocket board = new MultiPhaseBoard();board.hasTriphase();board.hasTwoPhase();}
}

4.对象扩展适配器

5.对象扩展适配器源码

/*** 功能要求*/
public interface FunctionInterface {/** 能做软件*/public boolean canDoSoft();/** 能修硬件*/public boolean canFixhardward();
}/*** 软件公司*/
public class SoftwareCompany {public boolean canDoSoft(){System.out.println("软件公司专业做软件");return true;}
}/*** 硬件公司*/
public class HardwareCompany implements FunctionInterface{//外包一家软件公司private SoftwareCompany softwareCompany;public HardwareCompany(SoftwareCompany softwareCompany){this.softwareCompany = softwareCompany;}/** 用软件公司做软件*/@Overridepublic boolean canDoSoft() {return softwareCompany.canDoSoft();}/** 自己修硬件*/@Overridepublic boolean canFixhardward() {System.out.println("我是硬件公司修硬件没问题");return true;}
}/*** 测试流程*/
public class Test {public static void main(String[] args) {FunctionInterface function = new HardwareCompany(new SoftwareCompany());function.canDoSoft();function.canFixhardward();}
}

6.接口适配器

7.接口适配器源码

/*** 多方法接口*/
public interface MultiMethod {public void method1();public void method2();public void method3();public void methodN();
}/*** 抽象类为所有接口方法提供空实现*/
public class AbstractMultiMethod implements MultiMethod {@Overridepublic void method1() {}@Overridepublic void method2() {}@Overridepublic void method3() {}@Overridepublic void methodN() {}
}/*** 只用方法1的类*/
public class UserMethod1 extends AbstractMultiMethod{@Overridepublic void method1() {System.out.println("我只用这个方法,我就重写这个方法就可以了");}
}/*** 只用方法N的类*/
public class UserMethodN extends AbstractMultiMethod{@Overridepublic void methodN() {System.out.println("我只用这个方法,我就重写这个方法就可以了");}
}

趣学Java设计模式相关推荐

  1. 重学Java设计模式-创建者模式-工厂方法模式

    重学Java设计模式-创建者模式-工厂方法模式 内容摘自:重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」 | bugstack 虫洞栈 工厂方法模式介绍 图片 ...

  2. 重学Java设计模式-创建者模式-建造者模式

    重学Java设计模式-创建者模式-建造者模式 内容摘自:重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」 | bugstack 虫洞栈 建造者模式介绍 图片来自:https:/ ...

  3. 《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料...

    持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥 博客:https://bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获!???? ❞ 目录 一.前言 二.简介 1. 谁发明了设 ...

  4. 重学 Java 设计模式:实战适配器模式

    重学 Java 设计模式:实战适配器模式 一.前言 擦屁屁纸80%的面积都是保护手的! 工作到3年左右很大一部分程序员都想提升自己的技术栈,开始尝试去阅读一些源码,例如Spring.Mybaits.D ...

  5. java 观察者模式_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...

    一.前言 知道的越多不知道的就越多 编程开发这条路上的知识是无穷无尽的,就像以前你敢说精通Java,到后来学到越来越多只想写了解Java,过了几年现在可能想说懂一点点Java.当视野和格局的扩大,会让 ...

  6. 趣学java,编程趣学习app

    编程趣学习在这里会有多种编程语言是可以去学习的Java或者是c++,入门级的海鸥就是更加有难度的都是可以选择一个自己可以去学习的课程,跟着讲师一同开始及逆行语言基础知识的学习后面大家就是根据自己的的课 ...

  7. 重学 Java 设计模式:实战组合模式(营销差异化人群发券,决策树引擎搭建场景)

    一.前言 小朋友才做选择题,成年人我都要 头几年只要群里一问我该学哪个开发语言,哪个语言最好.群里肯定聊的特别火热,有人支持PHP.有人喊号Java.也有C++和C#.但这几年开始好像大家并不会真的刀 ...

  8. 大聪明教你学Java设计模式 | 第一篇:单例模式 (懒汉模式和饿汉模式)

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  9. 大聪明教你学Java设计模式 | 第二篇:建造者模式

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

最新文章

  1. JAVA中文注解驱动,解决api接口返回的json里面出现中文乱码的问题
  2. MFC中小笔记(三)
  3. linux查看usb设备文件,linux – 确定USB设备文件路径
  4. Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略
  5. leetcode518. 零钱兑换 II
  6. apache poi_将HTML转换为Apache POI的RichTextString
  7. html中擦窗效果,纯CSS写的小雨打在窗户上效果
  8. NOIP2015 写后感
  9. java8安装_安装jenkins
  10. eclipse中提示“java application configureation name i”
  11. C# 将JSON数组转化为对象
  12. verilog语法基础
  13. Python对遥感影像重采样,以及重采样方法
  14. 手机芯片内部构造-数据提取方法
  15. Spring Boot Admin监控中心详细讲解
  16. 怎么去掉ECShop购物流程中收货人电子邮箱必填
  17. bzoj 4765: 普通计算姬
  18. python春节集五福_2017支付宝集五福 2017年支付宝五福活动的python生福脚本
  19. Android 中英文切换及遇到的问题
  20. 解决页面可以左右滑动但无法上下滑动(有坑))

热门文章

  1. 云计算培训那个机构好?如何筛选靠谱的培训机构?
  2. SkeyeVSS天燃气场站智能安防系统 实现天燃气智能化监管解决方案
  3. 2024年408 计算机考研 学习视频集
  4. 一致性测试--总结_1
  5. WebView交互架构项目实战(三):多进程WebView使用实践
  6. linux修改torrent文件格式,最新版本μtorrent for Linux已经完全解决了中文文件名问题啦...
  7. 怎么用matlab绘制半径为2的球面,绘制下列三维图形。 (2) (4)半径为10的球面 (10.0分)...
  8. Dlib机器学习指南图翻译
  9. python3.7-初学篇-21
  10. 华为防火墙跨三层mac识别配置