JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone()
方法实现浅克隆,浅克隆也要实现Cloneable
标记接口。而深克隆则是将对象通过序列化和反序列化
的方式进行创建和还原。
本小结将学习的是工厂模式,这个模式在平时是特别常用的,还需好好理解。我也将举一些例子给大家
、
从生活出发
假设我们今天不想做饭,想出去吃饭、肯定选定一家好吃的川菜馆
,然后我们找好位置坐下,给厨师
说,我想吃糖醋排骨
。 稍微等待几分钟、菜就可以做好,然后给你呈上来。
这是一个很经典的例子,我们平时也经常有这样的实际问题,你发现了么?
- 我只需要告诉厨师
菜名
,我要吃啥就行了 - 我不关注这个菜是怎么
生产的 new()
开始撸代码
/**
* 抽象产品 菜
*/
public interface FoodProduct {
void show();
}
------------
/**
* 具体产品
*/
public class HongShao implements FoodProduct {
@Override
public void show() {
System.out.println("红烧排骨");
}
}
------------
public class TangCu implements FoodProduct {
@Override
public void show() {
System.out.println("糖醋鱼");
}
}
创建厨房工厂
创建一个厨房类,厨房可以用来生产食物产品,我们只需要告诉厨房,这里是通过id
编号的形式告诉厨房的。我们只需要告诉厨房所需要的食物
而不关心这个食物产品是如何创建出来的。
public class KitchenFactory {
/**
* id=1 上菜红烧肉 id=2 糖醋鱼
* @param id
*/
public FoodProduct cooking(int id) {
if (1 == id) {
return new HongShao();
} else {
return new TangCu();
}
}
}
KitchenFactory kitchen = new KitchenFactory();
FoodProduct food = kitchen.cooking(1);
food.show();
--------
红烧排骨
理解工厂模式
通过这个简单的例子,我们可以学习到:
- 无需关注对象是如何创建的。只需通过指定的
关键字
就能拿到我需要的产品,这就是简单工厂模式。
抽象工厂
抽象工厂,就是简单工厂的抽象版、如何理解呢?我们上面的工厂(厨房)它已经是一个确定的对象
了。而抽象工厂,则是在厨房
的基础上,再次衍生出一个接口,我们的厨房
则是这个抽象类的一个具体实例化。
代码源于生活
我又要开始举栗子了。请细细品
我们都知道小米
小米既可以生产手机
也可以生产电器用品
那么这就是一个很好的例子。
小米抽象工厂
是一个巨大的工厂,它里面有小米手机工厂
以及小米电器工厂
而不同的工厂,则生产不同的产品
。
代码教学开始
首先,我们得需要一个抽象工厂,这个工厂可以包含手机工厂和电器工厂。
public interface AbstractFactory {
/**
* 创建手机工厂
* @return
*/
PhoneFactory phoneFactory();
/**
* 创建电器工厂
* @return
*/
ElectricalFactory electricalFactory();
}
当然,手机工厂不知道是具体哪个工厂,反正它可以做一些事情,比如创建手机。
public interface PhoneFactory {
/**
* 手机工厂可以做的事情
*/
void show();
}
-----------
public interface ElectricalFactory {
/**
* 电器工厂可以生产电器
*/
void show();
}
上手实际创建一个小米工厂
public class XiaoMiFactory implements AbstractFactory {
@Override
public PhoneFactory phoneFactory() {
return new XiaoMiPhoneFactory();
}
@Override
public ElectricalFactory electricalFactory() {
return new XiaoMiElectricalFactory();
}
}
-------------
public class XiaoMiElectricalFactory implements ElectricalFactory {
@Override
public void show() {
System.out.println("小米电器工厂可以生产电器。。比如小米扫地机器人");
}
}
-------------
public class XiaoMiPhoneFactory implements PhoneFactory {
@Override
public void show() {
System.out.println("小米手机工厂可以生产小米手机。。。");
}
}
当然,小米工厂实现抽象工厂,那小米工厂就必须要包含两个子工厂,手机工厂和电器工厂了。我们也可以创建一个华为工厂,其实是一样的道理。
AbstractFactory factory = new XiaoMiFactory();
PhoneFactory phoneFactory = factory.phoneFactory();
phoneFactory.show();
--------
小米手机工厂可以生产小米手机。。。
我们从创建的小米工厂
中拿出小米手机工厂
然后再执行手机工厂可以做事情,抽象工厂,就是在上面的简单工厂
的层次上进行了再次的抽象,将具体的工厂进行抽象。
假设我们按照上面的逻辑。对于一个工厂,我想要一部手机
我给工厂说一声就行了。我不关心这个手机
是如何生产出来的。我该怎么操作?
我稍微将之前的几个接口作为稍微的改造。
public interface PhoneFactory {
/**
* 手机工厂可以做的事情
*/
PhoneProduct show();
}
---------------
public class XiaoMiPhoneFactory implements PhoneFactory {
@Override
public PhoneProduct show() {
return new PhoneProduct(1, "小米10 Pro");
}
}
----------
//手机对象
public class PhoneProduct {
private int id;
private String name;
}
我们可以创建这样一个访问器,通过访问器对象,将我们需要的对象名称传入就好比下单
它能自动匹配工厂,并且调用工厂创建产品
的方法,将我们需要的产品进行创建。
public class AbstractFactoryClient {
public PhoneProduct createPhone(String name) {
AbstractFactory factory = null;
if ("xiaomi" == name) {
factory = new XiaoMiFactory();
} else {
factory = new HuaweiFactory();
}
PhoneFactory phoneFactory = factory.phoneFactory();
return phoneFactory.show();
}
}
测试一下
AbstractFactoryClient factoryClient = new AbstractFactoryClient();
PhoneProduct product = factoryClient.createPhone("xiaomi");
System.out.println(product);
-----------
手机铭牌 编号:1,型号:小米10 Pro
小结
学习完本节,是否对于工厂模式和抽象工厂有了一个深入的了解呢?工厂模式其实在平时的代码中,还是比较常用的。所以还是需要更加努力学习和使用!
代码示例
https://gitee.com/mrc1999/Dev-Examples
参考
http://c.biancheng.net/view/1351.html
欢迎关注
JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式的更多相关文章
- Java设计模式之创建型模式
创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类
- Java设计模式_创建型模式_单例模式
单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图:
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- java设计模式 -------- 创建模式 之 抽象工厂模式
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...
- Typescript玩转设计模式 之 创建型模式
作者简介 joey 蚂蚁金服·数据体验技术团队 前言 我们团队的工作是用单页面应用的方式实现web工具.涉及到数万到十数万行的前端代码的管理,而且项目周期长达数年. 怎么样很好地管理好这种量级的前端代 ...
- GoF的23种设计模式之创建型模式的特点和分类
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 设计模式01 创建型模式 - 建造者模式(Build Pattern)
参考 1. Builder Design Pattern | Youtube 2. 建造者模式(Builder和Director)| 博客园 3. 深入理解Builder模式 | 简书 建造者模式(B ...
随机推荐
- UPX的使用
UPX是一个通用可执行文件压缩器,由于其具有: 压缩率高:压缩效果优于zip/gzip: 解压速度快:在奔腾133上即可达到大约10MB/秒: 压缩的可执行文件没有额外的内存开销: 安全:可以列表,检 ...
- 【Storm】核心组件nimbus、supervisor、worker、executor、task
nimbus 是整个集群的控管核心,负责topology的提交.运行状态监控.任务重新分配等工作. zk就是一个管理者,监控者. 总体描述:nimbus下命令(分配任务),zk监督执行(心跳监控wor ...
- Java实现 LeetCode 404 左叶子之和
404. 左叶子之和 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 /** * Definiti ...
- Java实现 蓝桥杯VIP 算法训练 排列问题
算法训练 排列问题 时间限制:1.0s 内存限制:512.0MB 问题描述 求一个0-N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出 ...
- Java实现 LeetCode 152 乘积最大子序列
152. 乘积最大子序列 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- Java实现蓝桥杯二项式的系数规律
二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学家杨辉1261年所著的<详解九章算法>一书里就出现了. 其排列规律: 1 1 1 2 1 3 3 1 4 6 4 ...
- java代码(4)---guava之Immutable(不可变)集合
Immutable(不可变)集合 一,概述 guava是google的一个库,弥补了java语音的很多方面的不足,很多在java8中已有实现,暂时不展开,Collections是jdk提供的一个工 ...
- ArrayDeque使用&实现原理分析
ArrayDeque使用&实现原理分析 学习Okhttp实现源码时,发现其任务分发时用到了ArrayDeque.因此了解一下ArrayDeque的使用方式和实现原理. 一.Deque dequ ...
- 分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教程
书接上文 上篇文章「MySQL 可重复读,差点就让我背上了一个 P0 事故!」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下. 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么 ...