工厂模式--简单工厂模式--抽象工厂模式
工厂模式
作用:实现创建者与调用者的分离
简单工厂模式、工厂方法模式、抽象工厂模式,都是属于创建型设计模式。严格上来说,简单工厂模式不属于23设计模式之一,因为它违背了开闭原则。
===========概念先大概了解,以代码为驱动。学完代码后理解概念
oop七大原则:
开闭原则:一个软件的实体应当对扩展开发,对修改关闭。
依赖倒转原则:要争对接口编程,不用争对实现编程。
迪米特法则:只与你直接的朋友通信,避免和陌生人通信。
核心本质:
实例化对象不使用new,用工厂方法替代。
将选择实现类,创建对象统一管理控制,从而将调用者跟我们的实现类解耦。
简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,要求修改已有代码)。
工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)。
抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
=======================================================================================
简单工厂模式:
举例:和很多人一起出去玩,大家伙托我去购买冰淇淋。(假设一家店只卖一种口味冰淇淋)。
大家的需求是什么?(每个人都想吃自己喜欢的冰淇淋)
我的任务思考是什么?(我必须明白哪个店卖的是哪种口味的冰淇淋)
针对以上概述去设计面向对象代码。
1.大家共同的需求是都需要冰淇淋,我们设计一个冰淇淋接口。
public interface IceCream {//冰淇淋口味public void taste();
}
2.上述规定,一家店只卖一种口味冰淇淋。为了满足大家口味,我们有三家冰淇淋店,分别售卖,草莓味,香蕉味,苹果味的冰淇淋。我们设计接口的实现类,相当于设置三家冰淇淋店铺。
public class Apple_Ice_Cream implements IceCream {@Overridepublic void taste() {System.out.println("苹果味的冰淇淋");}
}
public class Banana_Ice_Cream implements IceCream {@Overridepublic void taste() {System.out.println("香蕉味的冰淇淋");}
}
public class Strawberry_Ice_Cream implements IceCream {@Overridepublic void taste() {System.out.println("草莓味的冰淇淋");}
}
3.假设如果我现在去买冰淇淋,我面临的问题就是我需要跑去各个店铺去购买不同口味的冰淇淋,这样即浪费了时间,也浪费了精力。我就想,如果有一台冰淇淋机器。上面有不同口味冰淇淋,我只要点击不同口味的按钮。冰淇淋自动出来。这种思想下我们设计一个工厂类,模拟冰淇淋机器。
public class Ice_Factory {public static IceCream creamIceCream(String taste) {IceCream iceCream = null;// 这里我们通过switch来判断,具体制作哪一种口味的冰激凌switch (taste) {case "Apple":iceCream = new Apple_Ice_Cream();break;case "Strawberry":iceCream = new Strawberry_Ice_Cream();break;case "Banana":iceCream = new Banana_Ice_Cream();break;default:break;}return iceCream;}
}
4.目前冰淇淋机器有了,我点击按钮去购买冰激凌。
public class Client {public static void main(String[] args) {// 通过统一的工厂,传入不同参数调用生产冰激凌的方法去生产不同口味的冰激凌IceCream appleIceCream = Ice_Factory.creamIceCream("Apple");appleIceCream.taste();//相当于点击了苹果味的按钮IceCream bananaIceCream = Ice_Factory.creamIceCream("Banana");bananaIceCream.taste();//相当于点击了香蕉味的按钮IceCream StrawberryIceCream = Ice_Factory.creamIceCream("Strawberry");StrawberryIceCream.taste();//相当于点击了草莓味的按钮}
}
结果示例:
简单工厂模式方法中,工厂类内通常有一个静态的方法,通过switch中不同的值或者if else语句来创建不同的对象并返回。简单工厂模式也被称作“静态工厂模式”,在客户端直接调用工厂类的该方法就可以。整个冰激凌的生产(创建不同口味冰激凌的过程)被这个工厂类封装了,客户端不用去关注这些细节。
如果没有工厂类,我们自己去实例上面的三家店铺。工厂类相当于封装了三家店铺。
但这种设计模式下违反了开闭原则,如果我们现在需要增加新的口味,则需要修改原来的工厂类代码。为解决上述问题,则产生了工厂方法模式。
工厂方法模式
我们可以设计多个工厂,每个工厂只负责生产一种口味的冰淇淋。相当于多台生产冰激凌的机器,每台机器只能生产一种口味的冰激凌,每台机器有一个按钮,点击下去就会吐出该口味冰激凌。代码如下:
1.定义冰淇淋接口,实现冰淇淋的各种口味类。这里和简单工厂模式代码一样。
//定义的冰淇淋接口类
public interface IceCream {//冰淇淋口味public void taste();
}
//苹果味
public class Apple_Ice_Cream implements IceCream {@Overridepublic void taste() {System.out.println("苹果味的冰淇淋");}
}
//香蕉味
public class Banana_Ice_Cream implements IceCream {@Overridepublic void taste() {System.out.println("香蕉味的冰淇淋");}
}
//草莓味
public class Strawberry_Ice_Cream implements IceCream {@Overridepublic void taste() {System.out.println("草莓味的冰淇淋");}
}
2.我们设计多个工厂,可以定义一个工厂接口。
public interface Ice_Cream_Factory {//创建工厂public IceCream createIceCream();
}
3.增加工厂接口的实现类。相当于生产多台冰激凌的机器,每台机器只能生产一种口味的冰激凌。
//苹果味机器
public class Apple_Factory implements Ice_Cream_Factory {@Overridepublic IceCream createIceCream() {return new Apple_Ice_Cream();}
}
//香蕉味机器
public class Banana_Factory implements Ice_Cream_Factory {@Overridepublic IceCream createIceCream() {return new Banana_Ice_Cream();}
}
//草莓味机器
public class Strawberry_Factory implements Ice_Cream_Factory {@Overridepublic IceCream createIceCream() {return new Strawberry_Ice_Cream();}
}
4.目前冰淇淋机器有了,我选择生产不同口味机器点击按钮去购买冰激凌。
public class Client {public static void main(String[] args) {//拿到生产苹果味工厂Ice_Cream_Factory applefactory = new Apple_Factory();IceCream appleIceCream = applefactory.createIceCream();appleIceCream.taste();//相当于点击了苹果味的按钮//拿到生产香蕉味工厂Ice_Cream_Factory Bananafactory = new Banana_Factory();IceCream BananaIceCream = Bananafactory.createIceCream();BananaIceCream.taste();//相当于点击了香蕉味的按钮//拿到生产草莓味工厂Ice_Cream_Factory Strawberryfactory = new Strawberry_Factory();IceCream StrawberryfactoryIceCream = Strawberryfactory.createIceCream();StrawberryfactoryIceCream.taste();//相当于点击了草莓味的按钮}
}
结果示例:
工程方法模式代码具有良好的扩展性,假如我们需要实现葡萄味的冰淇淋,只需要在IceCream口味接口的增加葡萄味实现类,
Ice_Cream_Factory机器接口增加生产葡萄味的机器就可以了。
抽象工厂模式
1.产品等级结构:不管什么品牌的手机,都是手机属于同一产品等级结构。
2.产品族:小米工厂生产的任何产品,只要是小米品牌的,即为产品族。
抽象工厂代码分为俩步。第一步设计产品,第二步设计工厂。第三步工厂中实例化产品。第四步使用客户端。
第一步设计产品
1.定义手机和路由器产品接口
//手机产品
public interface iPhone {//开机public void start();//关机public void shut();
}
//路由器产品
public interface router {//开机public void start();//关机public void shut();
}
2.各个品牌厂商去实现手机具体产品
//小米厂商实现类
public class XiaomiiPhoneImpl implements iPhone {@Overridepublic void start() {System.out.println("小米手机开机中。。。");}@Overridepublic void shut() {System.out.println("小米手机关机中。。。");}
}
//华为厂商实现类
public class HuaweiiPhoneImpl implements iPhone {@Overridepublic void start() {System.out.println("华为手机开机中。。。");}@Overridepublic void shut() {System.out.println("华为手机关机中。。。");}
}
3.各个品牌厂商去实现路由器具体产品
public class Xiaomirouter implements router {@Overridepublic void start() {System.out.println("小米路由器开机中。。。");}@Overridepublic void shut() {System.out.println("小米路由器关机中。。。");}
}
public class Huaweimirouter implements router {@Overridepublic void start() {System.out.println("华为路由器开机中。。。");}@Overridepublic void shut() {System.out.println("华为路由器关机中。。。");}
}
第二步设计工厂
1.定义抽象工厂接口,实现产品(抽象工厂接口可以理解为产品族工厂)
public interface AbstractFactory {//生产手机public iPhone createiPhone();//生产路由器public router createrouter();
}
第三步工厂中实例化产品
小米工厂实现类去实例化小米手机产品实现类
小米工厂实现类去实例化小米路由器产品实现类
华为工厂实现类去实例化华为手机产品实现类
华为工厂实现类去实例化华为路由器产品实现类
public class xiaomiFactory implements AbstractFactory {//实例化小米手机产品实现类@Overridepublic iPhone createiPhone() {return new XiaomiiPhoneImpl();}//实例化小米路由器产品实现类@Overridepublic router createrouter() {return new Xiaomirouter();}
}
public class HuaweiFactory implements AbstractFactory {//实例化华为路由器产品实现类@Overridepublic iPhone createiPhone() {return new HuaweiiPhoneImpl();}//实例化华为路由器产品实现类@Overridepublic router createrouter() {return new Huaweimirouter();}
}
第四步使用客户端。
public class Client {public static void main(String[] args) {System.out.println("=============小米产品族====================");xiaomiFactory xiaomiFactory = new xiaomiFactory();iPhone iPhone = xiaomiFactory.createiPhone();iPhone.start();iPhone.shut();router createrouter = xiaomiFactory.createrouter();createrouter.start();createrouter.shut();System.out.println("=============华为产品族====================");HuaweiFactory huaweiFactory = new HuaweiFactory();iPhone iPhone1 = huaweiFactory.createiPhone();iPhone1.start();iPhone1.shut();router createrouter1 = huaweiFactory.createrouter();createrouter1.start();createrouter1.shut();}
}
结果示例:
一.简单工厂模式
1.首先定义一个产品的共同接口。
2.产品实现类去实现产品接口。
3.定义一个生产工厂类,封装一个静态方法。利用静态方法根据输入参数生产对应产品,隐藏产品实例化细节。
4.客户端输入产品类型对应生产产品。对于客户端来说,去除了与具体产品得依赖。
当客户需要增加产品,必须在工厂类中的静态方法中增加对应得判断分支,所以工厂模式违背了开闭原则。
二.工厂方法模式
1.定义一个工厂接口
2.定义一个产品接口
3.A工厂实现类去实例化A产品实现类
4.B工厂实现类去实例化B产品实现类
5.客户端拿到对应生产A产品的工厂去拿到A产品
当需要增加新产品,只需要实现工厂和产品接口即可,对原有代码没有任何影响,非常符合开闭原则。
三.抽象工厂
第一步设计产品
第二步设计工厂
第三步工厂中实例化产品
第四步使用客户端
工厂模式中,一个工厂生产一个产品,所有产品派生于同一个抽象产品(或产品接口)。
抽象工厂中,每个工厂都可以生产多个产品,它们是一个品牌。而不同的产品继承自不同的抽象产品接口中。
工厂模式--简单工厂模式--抽象工厂模式相关推荐
- Java设计模式-工厂模式(3)抽象工厂模式
在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...
- 抽象工厂模式_设计模式(3) 抽象工厂模式
抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...
- 工厂模式三部曲之三_抽象工厂模式(附三部曲源码)
抽象工厂模式是对工厂模式的进一步抽象,是工厂模式中最为抽象和最具一般性的一种形态,提供了创建一系列相关或者相互依赖对象的接口,而无需指定他们的类型. 如果你对工厂模式还有些迷惑的,可以回顾下工厂模式的 ...
- 【设计模式】11-15:迪米特拉(最小知识)原则、外观模式、建造者模式、观察者模式、抽象工厂模式...
十一.迪米特拉原则/最小知识原则 如果两个类直接进行通信,那么这两个类就不能存在关系 调用其他类的方法时,需要第三个类实现转发-->外观类 尽量降低类的访问权限 十二.外观模式 隐藏系统的复杂性 ...
- 设计模式总结四(外观模式、建造者模式、观察者模式和抽象工厂模式)
序 这么多天里,我已经读完了<大话设计模式>.放寒假了,没有了通过学业考试的重担,阅读技术书籍的时间页多出来了不少. 在今天我刚阅读了<kafka权威指南>的第一章,关于介绍k ...
- 抽象工厂模式_常用设计模式--抽象工厂模式
抽象工厂模式 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 作用 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的 ...
- FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式
具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...
- 抽象工厂模式_设计模式系列—抽象工厂模式
前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...
- python抽象工厂模式_Python设计模式之抽象工厂模式
Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...
- 设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?
还记得之前的工厂方法模式么?现在老板更加富有了,除了水果,还准备搞点其他的生意,再做点服装生意.水果工厂和服装工厂明显就不是同一种东西,肯定不能放到一个工厂里面生产,服装也有好几种,但是不同的工厂,也 ...
最新文章
- Antd Vue range-picker 日期初始值设置 与 重置日期踩坑总结
- 【视频版】有一种机房叫处女座的机房。。。
- IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用
- try....exception....finally
- 如何使用ABAP代码反序列化JSON字符串成ABAP结构
- 华为、中兴圈地IPTV金矿 中小企业南柯一梦
- 分糖果(信息学奥赛一本通-T1380)
- org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard
- 5 Java NIO Scatter 与Gather-翻译
- 安卓recovery如何传递启动参数
- matlab-画折线图
- lisp天正图元位置修改_关于图元改层的,请求大佬帮助 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
- EXCEL技能1:SUMIFS 小白详解
- P1757 通天之分组背包(动态规划 分组背包)
- c++中的有符号数与无符号数一起运算
- [闻缺陷则喜]编码与实现方式
- 做人,该善良时就善良,该勇敢时就要有勇气去对应
- 啊哈C——学习3.6一起来找茬
- 多元线性回归之Spss实现
- 这样理解mmap,挺有意思!
热门文章
- 苹果Airplay协议以及AirTunes流程总结
- AutoJs UI版
- 二战中真实的打酱油船
- 删除计算机自带的游戏软件,win10系统删除自带游戏的处理办法
- html中js正则表达式手机,js验证电话号码与手机支持+86的正则表达式
- 安装python包的时候文件夹权限报错:InvalidArchiveError(“Error with archive D:\\anaconda\\pkgs\\cudnn-8.4.1.50-h)
- 我的AI转型之路与AI之我见(非985211的奋斗路程与视角)
- 盘点国内优秀的机器人公司
- 【Python爬虫案例学习21】爬取某站上海租房图片
- app上架360手机助手流程