[19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

一、工厂模式(分为:简单工厂模式、工厂方法模式、抽象工厂模式)

    实现了创建者和调用者的分离

核心本质:1、实例化对象,用工厂方法代替new操作;2、将选择实现类、创建对象统一管理和控制,从而将调用者跟实现类解耦。

简单工厂模式:用来生产同一等级结构中的任意产品(对于增加的新的产品,需要修改已有代码)

工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)

抽象工厂模式:用来生产不同产品族中的全部产品(对于增加新的产品,无能为力。支持增加新的产品族)

【扩展】面向对象设计的基本原则(核心就是"分工")

OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。

DIP(依赖倒转原则,Dependence Inversion Principe):要针对接口编程,不要针对实现编程。

LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,避免和陌生人通信(某个类尽量与少的类反生依赖关系)。

二、各种模式详解

1、简单工厂模式(静态工厂模式)

/*** 一个"汽车"类 接口 */
package cn.sxt.pattern;public interface Car {void run();
}/** "奥迪"类* */
package cn.sxt.pattern;public class Audi implements Car{public void run() {System.out.println("奥迪在跑!");        }
}/*** "比亚迪"类*/
package cn.sxt.pattern;public class Byd implements Car{public void run() {System.out.println("比亚迪在跑!");}
}

【没有采用工厂模式】

/**** 没有采用工厂模式的情况下*/
package cn.sxt.pattern;public class Test_0423_Client01 {//调用者public static void main(String[] args) {Car car=new Audi();Car car2=new Byd();car.run();car2.run();    }
}

类图:

【采用简单工厂模式】

/**** 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加的新的产品,需要修改已有代码)* 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)* 抽象工厂模式:用来生产不同产品族中的全部产品(对于增加新的产品,无能为力。支持增加新的产品族)
* 采用简单工厂模式的一个工厂,如果要增加新的子类如“红旗”类,只能修改已有的代码 ("return null") 做修改,但是违反开闭原则*
*/ package cn.sxt.pattern;public class Test_0423_Factory {public static Car createCar(String type) {if ("奥迪".equals(type)) {return new Audi(); }else if ("比亚迪".equals(type)) {return new Byd(); }else {return null;} }//也可以采用这种方式去创建类对象所以也称它为静态方法 /* public static Car createAudi(){return new Audi();}public static Car createByd() {return new Byd(); }*/ }/**** 采用简单工厂模式的情况下*/ package cn.sxt.pattern;public class Test_0423_Client02 {//调用者public static void main(String[] args) {Car car=Test_0423_Factory.createCar("奥迪");//不用直接与Audi类打交道,而是与工厂类打交道,通过调用方法new对象Car car2=Test_0423_Factory.createCar("比亚迪");car.run();car2.run(); } }

类图:

2、工厂方法模式

【一个工厂方法接口和客户类】

/**** 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)*/
package cn.sxt.pattern;public interface Test_0423_Factory2 {Car createCar();
}

/**** 采用工厂方法模式的情况下*/ package cn.sxt.pattern; public class Test_0423_Client03 {//调用者public static void main(String[] args) {Car car=new AudiFactory().createCar();Car car2=new BydFactory().createCar();//如果要造奔驰,那么直接增加benz.java和benzFactory.java,这样不需要修改原有代码,符合开闭原则。但是会增加代码量 car.run();car2.run(); } }

【各种车型的工厂】


/**
* "奥迪"专门的工厂*/ package cn.sxt.pattern;public class AudiFactory implements Test_0423_Factory2 {public Car createCar() {return new Audi();}}/**"比亚迪"专门的工厂* */ package cn.sxt.pattern;public class BydFactory implements Test_0423_Factory2 {public Car createCar() {return new Byd();}}

类图:

3、抽象工厂模式

   用来生产不同产品族的全部产品

   抽象工厂模式是针对产品族的情况,在多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是个很好解决办法。

【产品族】 一个产品族:发动机、座椅、轮胎

由 高级发动机、高级座椅、高级轮胎组成一个高级产品族 ,生成一个高端汽车;

由 低级发动机、低级座椅、低级轮胎组成一个低级产品族 ,生成一个低端汽车。

【一个产品族】

/**** "发动机"接口*/
package cn.sxt.abstractFactory;public interface Engine {void run();void start();
}class LuxuryEngine implements Engine{ //"好发动机"类 public void run() {System.out.println("转的快!");        }public void start() {System.out.println("启动快!");            }     
}class LowEngine implements Engine{ //"差发动机"类 public void run() {System.out.println("转的慢!");        }public void start() {System.out.println("启动慢!");            }     
}/**** "座椅"接口*/
package cn.sxt.abstractFactory;public interface Seat {void comfortable();
}class LuxurySeat implements Seat{ //"好座椅"类 public void comfortable() {System.out.println("坐着舒服!");        }
}class LowSeat implements Seat{ //"差座椅"类 public void comfortable() {System.out.println("坐着难受!");        }    
}/**** "轮胎"接口*/
package cn.sxt.abstractFactory;public interface Tyre {void friction();
}class LuxuryTyre implements Tyre{ //"好轮胎"类 public void friction() {System.out.println("摩擦力大!");        }
}class LowTyre implements Tyre{ //"差轮胎"类 public void friction() {System.out.println("摩擦力小!");        }    
}

【工厂类】

/**** "造汽车的工厂"接口*/
package cn.sxt.abstractFactory;public interface Test_0423_Factory03 {Engine createEngine();Seat createSeat();Tyre createTyre();
}/*** //造"高端汽车"的工厂*/
package cn.sxt.abstractFactory;public class LuxuryCarFactory implements Test_0423_Factory03{ public Engine createEngine() {return new LuxuryEngine();//返回好发动机的对象
    }public Seat createSeat() {return new LuxurySeat();}public Tyre createTyre() {return new LuxuryTyre();}
}/*** //造"低端汽车"的工厂*/
package cn.sxt.abstractFactory;public class LowCarFactory implements Test_0423_Factory03{ public Engine createEngine() {//返回差发动机的对象return new LowEngine();}public Seat createSeat() {return new LowSeat();}public Tyre createTyre() {return new LowTyre();}
}

【一个客户对象】

/**** 采用抽象工厂模式的情况下*/
package cn.sxt.abstractFactory;public class Test_0423_Client04 {//调用者public static void main(String[] args) {Test_0423_Factory03 factory=new LuxuryCarFactory();Engine engine=factory.createEngine();engine.run();engine.start();Test_0423_Factory03 factory2=new LowCarFactory();Tyre tyre=factory2.createTyre();tyre.friction();}
}

【类图】

转载于:https://www.cnblogs.com/ID-qingxin/p/10747583.html

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

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

相关文章

Chrome浏览器12px问题-webkit-text-size-adjust: none 已失效的解决方案

对于早期的chrome, 如果要想显示12px以下的字体,一般通用的方案都是在对应的元素中添加 div {-webkit-text-size-adjust: none; }但是我今天遇到的需求,添加了之后没有反应,而且浏览就根本不支持这种写法。 在网上看到了博客《Chrome浏览器…

深入理解vue中的slot与slot-scope

写在前面 vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项在使用频率、使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学&#…

关于Java抽象类,接口与实现接口及派生类继承基类

1. 抽象类 抽象类就是有一个或多个方法只被声明而未被实现。 抽象方法的声明以分号结束,并且用关键字abstract来说明它以标识它为抽象方法。 格式: public abstract class 类名{ 定义变量// 抽象方法// } 2. 接口是抽象类的一种,之包含常量…

Luogu P1471 方差

题目传送门 开了十倍空间才过是什么鬼?该不会我线段树炸了吧……细思极恐 平均数都会求,维护区间和,到时候除一下就好了。 方差的求法如下(用的Luogu的图片) 因为要维护一个平方,我们可以考虑使用van♂完全平方公式将它拆开&#…

Android SDK 2.3/3.0/4.0/4.2 下载与安装教程

Eclipse下搭建Android开发环境教程:http://dev.son1c.com/show/1253.html Google已经发布了Android SDK 4.2版本.下面给朋友们介绍一下安装 Android 模拟器 Emulator模拟器的方法: 1、首先确定安装了Java JDK,如果没有,可以去http://www.ora…

浏览器渲染原理与过程

一、浏览器如何渲染网页 要了解浏览器渲染页面的过程,首先得知道一个名词——关键路径渲染。关键渲染路径(Critical Rendering Path)是指与当前用户操作有关的内容。例如用户在浏览器中打开一个页面,其中页面所显示的东西就是当前…

深入理解CSS盒模型 - 程序猿的程 - 博客园

深入理解CSS盒模型 本文是学习中传思客在慕课网开的课程《前端跳槽面试必备技巧》的学习笔记。课程地址:https://coding.imooc.com/class/evaluation/129.html#Anchor。 如果你在面试的时候面试官让你谈谈对盒模型的理解,你是不是不知从何谈起。这种看似…

线程死锁问题

1 package com.demo.bingfa;2 3 /**4 * java并发编程中,死锁的概念5 *6 * 我们启用了两个线程,分别抢占2个资源,但这两个资源又分别被不同的对象(字符串)锁住了。7 * 当第一个线程调用 resource1 方法,…

使用PM2搭建在线vue.js开发环境(以守护进程方式热启动)

项目以vue.jslayUI的作为前端开发技术栈,需要有一个在线的环境供项目成员实时查看效果,总不能每次都webpack打包发布后才能看到效果吧!刚开始就简单使用npm run dev命令热启动,但是shell命令窗口退出后,热启动也就失效…

zabbix实现mysql数据库的监控

先来介绍zabbix中几个常用的术语: 主机(host): 要监控的网络设备,可由ip或DNS名称指定。 主机组(host group): 主机的逻辑容器,可以包含主机和模板&#xff…

VSCode配合eslint进行JavaScript质量检查

写在开始前:如有不准确的地方希望大家提出,文章可以改知识不能错。 创建一个项目 这里已node项目为例 npm init 根据提示填写相关信息 安装eslint npm install eslint --save也可以全局安装 npm install eslint -g初始化 eslint文件 eslint --init执行命…

未找到导入的项目,请确认 Import 声明中的路径正确

VS2017打开以前vs版本开发的项目 <Import Project"$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project"$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" /> 修改V12…

bzoj [Usaco2009 Hol]Cattle Bruisers 杀手游戏

Description Input 第1行输入N&#xff0c;R&#xff0c;BX&#xff0c;BY, BVX&#xff0c;BVY&#xff0c;之后N行每行输入四个整数Xi&#xff0c;Yi&#xff0c;VXi&#xff0c;VYi&#xff0e; Output 一个整数&#xff0c;表示在逃脱过程中&#xff0c;某一个时刻最多有这…

Visual Studio Code 使用 ESLint 增强代码风格检查 - gyzhao - 博客园

前言 在团队协作开发中&#xff0c;为了统一代码风格&#xff0c;避免一些低级错误&#xff0c;应该设有团队成员统一遵守的编码规范。很多语言都提供了Lint工具来实现这样的功能&#xff0c;JavaScript也有类似的工具&#xff1a;ESLint。除了可以集成到构建工具中(如&#x…

eclipse下使用git插件上传代码至github

eclipse下使用git插件上传代码至github 1.eclipse下安装git 正常情况下&#xff0c;eclipse 是自带 git 插件的&#xff0c;那么即可跳至步骤1的最后一小步&#xff0c;配置 git 。 如果十分悲剧&#xff0c;你的 eclipse 中见不到 git 的身影&#xff0c;那么也没关系&#…

VS(C++)配置Halcon(一次配置,永久使用)

【说明】只需配置一次&#xff0c;以后新项目无需再次配置。 本教程是64位版本&#xff0c;32位可参考本教程。VS与Halcon无论哪个版本&#xff0c;都可参考本教程。 【步骤】以VS2015Halcon18.11为例 1、新建一个C|Win32控制台应用程序项目 2、视图|其他窗口|属性管理器 在 De…

(转)msys2使用教程

一、安装 官方下载地址 http://www.msys2.org/ 指定好安装路径&#xff08;一般D根目录即可&#xff09;&#xff0c;一路下一步就好。 二、配置国内镜像、设置窗体修改颜色 使用[清华大学开源软件镜像站]中的地址&#xff0c;修改\etc\pacman.d目录下的三个文件。 配置教程 ht…

简单使用Git和Github来管理自己的代码和读书笔记

简单使用Git和Github来管理自己的代码和读书笔记 以前不知道使用代码管理工具&#xff0c;最后写的一些东西都没有了&#xff0c;由于硬盘坏了或者不小心格式化了之类的&#xff0c;后来使用了Git 和Github来托管自己的代码和读书笔记方便了不少&#xff0c;到哪里只要有网就可…

android 资源

在进行APP开发的过程当中&#xff0c;会用到许多资源&#xff0c;比如&#xff1a;图片&#xff0c;字符串等。现对android资源知识进行简单记录。 具体的详细信息及用法&#xff0c;点击查看官方文档 分类 一般android资源分为可直接访问的系统资源和不可直接访问的原生资源 r…

ssh整合学习(1)

Hibernate框架 1 hibernate核心配置文件 &#xff08;0&#xff09;orm思想 -对象关系映射 &#xff08;1&#xff09;数据库信息 &#xff08;2&#xff09;hibernate信息 &#xff08;3&#xff09;映射配置 &#xff08;4&#xff09;hibernate核心配置文件 -如果单纯使用hi…