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.代码重用性(即:相同功能的代码,不用多次编写) ...
随机推荐
- 【hexo】如何在一个小时内搭载个人博客
版权申明:本文为博主原创文章,未经博主允许不得转载.如需转载,请私聊博主. 什么是hexo Hexo是一个开源的静态博客生成器,用node.js开发,作者是台湾大学生tommy351. 前期准备 安装 ...
- 【LeetCode】138. Copy List with Random Pointer
题目: A linked list is given such that each node contains an additional random pointer which could poi ...
- 【Android Developers Training】 75. 使用NSD
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- sql将一列数据拼成一个字符串的方法
SELECT STUFF(CONVERT(VARCHAR(500), ( SELECT TOP 10 ',' + BG_Country FROM dbo.BS_Budget FOR XML PATH( ...
- 【SEO】搜索引擎优化的陷阱和作弊
一.认识SEO [理解] 站内优化是指更改网站内部结构,让网站利于蜘蛛爬取,比如网站内容: 站外优化是指发反向链接,给蜘蛛一个爬取你网站的通道. 其中,反向链接是指网页A 上有一个链接指向网页B,则网 ...
- MQ队列管理
分享一段代码,很实用. 下面这段java代码是我在国外一个论坛上发现的,源地址已经忘了.代码的作用是可以删除正在使用的mq的队列消息,管理mq的人一定知道它的美妙了吧,哈哈. 我拿来改了下,增加了2个 ...
- Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API
i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中 ...
- JavaScript一个生成文档目录的实例
执行结果: <body> <script type="text/javascript"> /** * 这个模块注册一个可在页面加载完成后自动运行的匿名函数, ...
- box-shadow阴影详解
每次使用box-shadow,都要查阅资料才能实现对应的效果,现在总结一下,方便以后查看. 使用语法: element{box-shadow: inset x-offset y-offset blur ...
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...