Java设计模式学习笔记,二:工厂模式
工厂模式,主要实现了创建者和调用者的分离。
分类:1、简单工厂模式;2、工厂方法模式;3、抽象工厂模式。
核心:实例化对象时,用工厂方法代替new操作。
一、简单工厂模式
也叫静态工厂模式,工厂类中实现静态方法,根据入参,生产不同的产品,工程项目中常用。
工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码。
package com.corey.factory.simpleFactory; /**
* 产品类接口
* @author Corey
*
*/
public interface Computer {
void calcData();
}
package com.corey.factory.simpleFactory; /**
* 具体产品实现接口
* @author Corey
*
*/
public class HighEndComputer implements Computer{ @Override
public void calcData() {
System.out.println("高端电脑计算速度快!");
} }
package com.corey.factory.simpleFactory; /**
* 具体产品实现接口
* @author Corey
*
*/
public class LowEndComputer implements Computer{ @Override
public void calcData() {
System.out.println("低端电脑计算速度慢!");
} }
package com.corey.factory.simpleFactory; /**
* 产品工厂类,生产同一等级结构中的任意产品
* @author Corey
*
*/
public class ComputerFactory { public static Computer CreateComputer(String type){
Computer computer = null; switch(type){
case "HighEnd":
computer = new HighEndComputer();
break;
case "LowEnd":
computer = new LowEndComputer();
break;
default:
break;
}
return computer;
}
}
package com.corey.factory.simpleFactory; /**
* 测试简单工厂模式
* @author Corey
*
*/
public class Test { public static void main(String[] args) {
Computer c1 = ComputerFactory.CreateComputer("HighEnd");
c1.calcData(); Computer c2 = ComputerFactory.CreateComputer("LowEnd");
c2.calcData(); } }
运行结果:
高端电脑计算速度快!
低端电脑计算速度慢!
二、工厂方法模式
工厂类作为接口使用,固定产品工厂类实现接口,用来生产统一等级结构中的固定产品,可扩展任意产品。
package com.corey.factory.factoryMethed; /**
* 产品工厂类作为接口使用
* @author Corey
*
*/
public interface ComputerFactory { Computer CreateComputer();
}
package com.corey.factory.factoryMethed; /**
* 具体产品工厂类实现接口
* @author Corey
*
*/
public class HighEndComputerFactory implements ComputerFactory{ @Override
public Computer CreateComputer() {
return new HighEndComputer();
} }
package com.corey.factory.factoryMethed; /**
* 具体产品工厂类实现接口
* @author Corey
*
*/
public class LowEndComputerFactory implements ComputerFactory{ @Override
public Computer CreateComputer() {
return new LowEndComputer();
} }
package com.corey.factory.factoryMethed; /**
* 测试工厂方法模式
* @author Corey
*
*/
public class Test { public static void main(String[] args) {
Computer c1 = new HighEndComputerFactory().CreateComputer();
c1.calcData(); Computer c2 = new LowEndComputerFactory().CreateComputer();
c2.calcData(); } }
三、抽象工厂模式
工厂类作为接口使用,内含生产配件方法接口,产品配件类作为接口使用,具体产品配件类实现接口,具体产品工厂类实现工厂类,用来生产不同产品族的全部产品,无法增加新产品,可扩展产品族。
package com.corey.factory.abstractFactory; /**
* 工厂类作为接口使用,内含组装配件方法接口
* @author Corey
*
*/
public interface ComputerFactory {
MainBoard createMainBoard(); //生产主板配件
HardDisk createHardDisk(); //生产硬盘配件
Memory createMemory(); //生产内存配件 }
package com.corey.factory.abstractFactory; /**
* 产品配件类作为接口使用
*
* @author Corey
*
*/
public interface HardDisk {
void speed(); //硬盘实现方法
}
package com.corey.factory.abstractFactory; /**
* 具体产品配件类实现接口
* @author Corey
*
*/
public class HighEndHardDisk implements HardDisk{ @Override
public void speed() {
System.out.println("高端硬盘速度快!");
} }
package com.corey.factory.abstractFactory; /**
* 具体产品工厂类实现工厂类,用来生产不同产品族的全部产品
* @author Corey
*
*/
public class HighEndComputerFactory implements ComputerFactory { @Override
public MainBoard createMainBoard() {
return new HighEndMainBoard();
} @Override
public HardDisk createHardDisk() {
return new HighEndHardDisk();
} @Override
public Memory createMemory() {
return new HighEndMemory();
} }
package com.corey.factory.abstractFactory; /**
* 测试抽象工厂模式
* @author Corey
*
*/
public class Test { public static void main(String[] args) {
ComputerFactory h = new HighEndComputerFactory();
HardDisk hHardDisk = h.createHardDisk();
MainBoard hMainBoard = h.createMainBoard();
Memory hMemory = h.createMemory();
hHardDisk.speed();
hMainBoard.speed();
hMemory.speed(); ComputerFactory l = new LowEndComputerFactory();
HardDisk lHardDisk = l.createHardDisk();
MainBoard lMainBoard = l.createMainBoard();
Memory lMemory = l.createMemory();
lHardDisk.speed();
lMainBoard.speed();
lMemory.speed();
}
}
运行结果:
高端硬盘速度快!
高端主板速度快!
高端内存速度快!
低端硬盘速度慢!
低端主板速度慢!
低端内存速度慢!
工厂模式基本就这些内容。
另,简单工厂还有另一种实现方式,就是编写不同的静态方法创建不同的产品,而无需传参,但是调用者需要知道更多的方法名。
Java设计模式学习笔记,二:工厂模式的更多相关文章
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- Java设计模式学习记录-抽象工厂模式
前言 上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上. 抽象工厂模式 抽象工厂模式是围绕着一个超级工厂创建其他工厂.这个超 ...
- Java 设计模式学习笔记1——策略模式(Duck例子)
0.假设现有工程(Duck)中遇到为类添加功能的问题,如何设计类添加新的功能? 1.利用继承提供的Duck(鸭子)的行为会导致哪些缺点? (1)代码在多个子类中重复 (2)很多男知道所有鸭子的全部行为 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- java设计模式学习笔记--接口隔离原则
接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...
- java设计模式学习笔记--单一职责原则
单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...
- java设计模式学习笔记--浅谈设计模式
设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...
随机推荐
- 【Android Developers Training】 49. 轻松录制视频
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- HTML基本结构与标签总结整理篇
HTML基本结构与标签总结整理篇 前言:这是笔者的学习总结与整理,如果有错误或疑问的地方,欢迎指正与讨论!另:此文会不定时更新~ 1.了解HTML 学习前端技术,必然涉及三个方面:html(结构).c ...
- visual studio for mac在线安装网络错误
vs2017 for mac 终于出正式版了,兴冲冲的准备摆脱虚拟机. 官网https://www.visualstudio.com/zh-hans/vs/visual-studio-mac/下了安装 ...
- 如何在家自制LED灯?很简单,我来告诉你!
首先LED分凸头.平头和凹头,当中的凹头是没无方向性. 做示宽灯这类晚间才运用的光源,用凹头就好,它没无方向性,可将整个反光碗照亮. 做转向灯等指示性的光源用,准绳上应该用凸头的,它是个聚光镜,投映的 ...
- javascript数组集锦
设计数组的函数方法 toString, toLocaleString, valueOf, concat, splice, slice indexOf,lastIndexOf, push, pop, s ...
- org.apache.commons.beanutils.BeanMap简单使用例子
一.org.apache.commons.beanutils.BeanMap; 将一个java bean允许通过map的api进行调用, 几个支持的操作接口: Object get(Object ke ...
- VB6之切换桌面
Desktop的API,用于切换或者系统桌面环境.扩展起来可以做一个锁屏程序或者多桌面程序. 模块部分: 'desktop.bas 'too much struct and declare unuse ...
- React 实践项目 (二)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- Linux下crontab命令添加Kettle作业定时任务
1. 确保作业 $KETTLE_HOME/kitchen.sh -file=/data1/testdata/testkjb.kjb 或转换 $KETTLE_HOME/pan.sh -file=/dat ...
- Mybatis mapper文件中的转义方法
在mybatis中的sql文件中对于大于等于或小于等于是不能直接写?=或者<=的,需要进行转义,目前有两种方式: 1.通过符号转义: 转义字符 < < 小于号 ...