设计模式-工厂模式
设计模式-工厂模式
1 简单工厂模式
1.1 介绍
工厂类通过create(String type)方法,通过传递不同的参数,创建不同的产品类。
1.2 UML类图
1.3 优缺点
优点:简单粗暴,在一个工厂中可以创建任何产品类。
缺点:没有遵循开闭原则,在新增新产品的基础上,必须修改原有的代码。在后续的迭代中,扩展性低。
1.4 示例
- 接口类interface Product
public interface Product {
void operation1();
void operation2();
}
- 产品类class ProductA
public class ProductA implements Product {
@Override
public void operation1() {
System.out.println("operation1 " + "ProductA");
}
@Override
public void operation2() {
System.out.println("operation2 " + "ProductA");
}
}
- 产品类class ProductA
public class ProductB implements Product {
@Override
public void operation1() {
System.out.println("operation1 " + "ProductB");
}
@Override
public void operation2() {
System.out.println("operation2 " + "ProductB");
}
}
- client
public class Client {
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
Product productA = productFactory.create("A");
Product productB = productFactory.create("B");
productA.operation1();
productA.operation2();
productB.operation1();
productB.operation2();
}
}
输出
operation1 ProductA
operation2 ProductA
operation1 ProductB
operation2 ProductB]
2 工厂方法模式
2.1 介绍
工厂方法模式,是针对每一种产品,提供一个工厂类。通过不同的工厂实例创建不同的产品实例。
2.2 UML类图
2.3 优缺点
- 优点:工厂方法很好的减轻的单个工厂的负担,把每一类产品交由特定的工厂创建;同时新增产品,只需要新增对应的工厂类,无需修改之前的代码,遵循开闭原则。
- 缺点:对于某些可能形成产品族的场景,处理比较复杂。
2.4 示例
- 对原来的代码进行改造ProductFactory
public interface ProductFactory {
Product create();
}
- ProductA 工厂ProductAFactory
public class ProductAFactory implements ProductFactory {
@Override
public Product create() {
return new ProductA();
}
}
- ProductB 工厂ProductBFactory
public class ProductBFactory implements ProductFactory {
@Override
public Product create() {
return new ProductB();
}
}
- client
public class Client {
public static void main(String[] args) {
ProductAFactory aFactory = new ProductAFactory();
ProductBFactory bFactory = new ProductBFactory();
Product productA = aFactory.create();
Product productB = bFactory.create();
productA.operation1();
productA.operation2();
productB.operation1();
productB.operation2();
}
}
输出
operation1 ProductA
operation2 ProductA
operation1 ProductB
operation2 ProductB
4 抽象工厂模式
4.1 介绍
抽象工厂应对的是产品族的概率。上述的工厂只负责生产固定的产品,抽象方法适用于生产一个族系的产品。
4.2 UML类图
4.3 工厂模式间的区别
- 简单工厂:用于生产同一级别结构的任意商品。
- 工厂方法:用于生产同一级别结构的固定商品。
- 抽象工厂:用于生产同一产品族的全部产品。
4.4 示例
汽车分为:轿车,SUV等系列车型,也分为奔驰,宝马等品牌。以下的示例代码为奔驰工厂奔驰系列产品,宝马工厂生产宝马系列产品。
- interface CarSuv
public interface CarSuv {
void operation1();
}
- class BenzCarSuv
public class BenzCarSuv implements CarSuv {
@Override
public void operation1() {
System.out.println("奔驰Benz SUV operation");
}
}
- class BwmCarSuv
public class BwmCarSuv implements CarSuv {
@Override
public void operation1() {
System.out.println("Bwm SUV operation");
}
}
- interface CarSedan
public interface CarSedan {
void operation1();
}
- class BenzCarSendan
public class BenzCarSendan implements CarSedan {
@Override
public void operation1() {
System.out.println("奔驰Benz 轿车 operation");
}
}
- class BwmCarSedan
public class BwmCarSedan implements CarSedan {
@Override
public void operation1() {
System.out.println("BWM 轿车 operation");
}
}
- interface CarFactory
public interface CarFactory {
CarSuv createCarSuv();
CarSedan creatCarSedan();
}
- class BwmCarFactory
public class BwmCarFactory implements CarFactory {
@Override
public CarSuv createCarSuv() {
return new BwmCarSuv();
}
@Override
public CarSedan creatCarSedan() {
return new BwmCarSedan();
}
}
- class BenzCarFactory
public class BenzCarFactory implements CarFactory {
@Override
public CarSuv createCarSuv() {
return new BenzCarSuv();
}
@Override
public CarSedan creatCarSedan() {
return new BenzCarSendan();
}
}
- client
public class Client {
public static void main(String[] args) {
BenzCarFactory benzCarFactory = new BenzCarFactory();
BwmCarFactory bwmCarFactory = new BwmCarFactory();
CarSuv benzCarSuv = benzCarFactory.createCarSuv();
CarSedan benzCarSedan = benzCarFactory.creatCarSedan();
CarSuv bwmCarSuv = bwmCarFactory.createCarSuv();
CarSedan bwmCarSedan = bwmCarFactory.creatCarSedan();
benzCarSuv.operation1();
benzCarSedan.operation1();
bwmCarSuv.operation1();
bwmCarSedan.operation1();
}
}
输出
奔驰Benz SUV operation
奔驰Benz 轿车 operation
Bwm SUV operation
BWM 轿车 operation
智能推荐
使用Xdebug进行远程调试
为什么要用? 方便联调: 和客户端一起联调,是die(); exit(); 会影响其他人员是使用。 关注数据变化: 正常情况下,我们在调试和开发时,更关注数据的变化。频繁断点、效率比较低。 简单: 之前的开发自己比较懒,一直没用,用起来发现很简单。 原理 运行xdebug需要客户端IDE(phpstorm)、远程服务器配合,首先是客户端配置好端口,发送debug请求,请求会通过浏览器或者IDE的h...
【教程向】通过windows在树莓派3B上安装Ubuntu MATE 16.04.2 (Xenial)
本文参考了http://www.ituring.com.cn/article/273613 ================================================================= 1:因为树莓派3B的性能问题,所以使用这个特别为树莓派设计的版本。 2:准备: 树莓派3B * 1 16GB TF/Micro SD卡 *1(尽量用速度快一些的卡,因为以后这相...
Caused by: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception
启动RMI报如下错误: 最后发现是端口冲突造成的,当时用的5003端口启动服务端的RMI刚好和本地的一个服务端口冲突。 输入netstat -aon|findstr "5003"查询它的pid为3056 继续输入tasklist|findstr "3056",查看是哪个进程或者程序占用了5003端口,结果是:magentproc.exe 找到PID后可以直接...
猜你喜欢
【LeetCode(Java) - 322】零钱兑换
文章目录 1、题目描述 2、解题思路 3、解题代码 1、题目描述 2、解题思路 定义 dp[i] 表示对于组成金额 i 的最少硬币个数。 如果方案存在,那么至少有一个硬币至少出现了一次: 如果是第 0 个硬币出现了一次,则:dp[i] = dp[i-coins[0]] + 1 如果是第 1 个硬币出现了...
在Visual Studio 2013中配置Entity Framework使用MySQL
环境 使用的软件及版本 - Microsoft Visual Studio Ultimate 2013 (版本 12.0.40629.00 Update 5) - Microsoft.Net Framework 版本 4.6.01055 - MySQL版本: 5.6.17 步骤 1. 创建空的MVC项目 2. 安装扩展 3. 在数据库中建立对应的表 必须在数据库内先新建表,否则asp.net mv...
Python才是世界上最好的言语,php,java靠边站
伟大的入门编程语言有什么特征呢?或者换一种方式问,“当我们教他们编程时,应该给予他们什么?”对于成年人和青少年学生,我认为以下五点非常重要。 学生从入门语言获得的五样东西 非常棒的首次体验,就像一本书的第一页,首先需要“入迷”,学习新知识不可避免的会遇到挫折,但要有持续的热情和好奇心,这对于那些从未接触过编码的年轻人来说是至关重要的; Web编程的能...
动态调整docker容器cpu资源
目的:动态调整系统cpu核数后,如何在不停止容器服务的情况下,docker动态使用最新的CPU资源 事件由来: 1、在ucloud上购买了一台可以热升级的机器,热升级指的是动态更改系统cpu和内存资源 2、随着业务的扩展,发现cpu、内存负载过高,需要在不停止业务的情况下动态扩容,因此使用了ucloud提供的热升级服务,从4核12G扩容为8核...
用python itchat包 爬取微信好友头像形成矩形头像集
原创作品,转载请注明作者 abysscarry-袁杰丶 初学python,我们必须干点有意思的事!从微信下手吧! 头像集样例如下: 大家可以发朋友圈开启辨认大赛哈哈~ 话不多说,直接上代码,注释我写了比较多,大家应该能看懂 运行结果: ok!!!...