工厂模式

作用:实现创建者与调用者的分离

简单工厂模式、工厂方法模式、抽象工厂模式,都是属于创建型设计模式。严格上来说,简单工厂模式不属于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产品

当需要增加新产品,只需要实现工厂和产品接口即可,对原有代码没有任何影响,非常符合开闭原则。

三.抽象工厂

第一步设计产品

第二步设计工厂

第三步工厂中实例化产品

第四步使用客户端

工厂模式中,一个工厂生产一个产品,所有产品派生于同一个抽象产品(或产品接口)。

抽象工厂中,每个工厂都可以生产多个产品,它们是一个品牌。而不同的产品继承自不同的抽象产品接口中。

工厂模式--简单工厂模式--抽象工厂模式相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. 抽象工厂模式_设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...

  3. 工厂模式三部曲之三_抽象工厂模式(附三部曲源码)

    抽象工厂模式是对工厂模式的进一步抽象,是工厂模式中最为抽象和最具一般性的一种形态,提供了创建一系列相关或者相互依赖对象的接口,而无需指定他们的类型. 如果你对工厂模式还有些迷惑的,可以回顾下工厂模式的 ...

  4. 【设计模式】11-15:迪米特拉(最小知识)原则、外观模式、建造者模式、观察者模式、抽象工厂模式...

    十一.迪米特拉原则/最小知识原则 如果两个类直接进行通信,那么这两个类就不能存在关系 调用其他类的方法时,需要第三个类实现转发-->外观类 尽量降低类的访问权限 十二.外观模式 隐藏系统的复杂性 ...

  5. 设计模式总结四(外观模式、建造者模式、观察者模式和抽象工厂模式)

    序 这么多天里,我已经读完了<大话设计模式>.放寒假了,没有了通过学业考试的重担,阅读技术书籍的时间页多出来了不少. 在今天我刚阅读了<kafka权威指南>的第一章,关于介绍k ...

  6. 抽象工厂模式_常用设计模式--抽象工厂模式

    抽象工厂模式 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 作用 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的 ...

  7. FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

    具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...

  8. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  9. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  10. 设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?

    还记得之前的工厂方法模式么?现在老板更加富有了,除了水果,还准备搞点其他的生意,再做点服装生意.水果工厂和服装工厂明显就不是同一种东西,肯定不能放到一个工厂里面生产,服装也有好几种,但是不同的工厂,也 ...

最新文章

  1. Antd Vue range-picker 日期初始值设置 与 重置日期踩坑总结
  2. 【视频版】有一种机房叫处女座的机房。。。
  3. IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用
  4. try....exception....finally
  5. 如何使用ABAP代码反序列化JSON字符串成ABAP结构
  6. 华为、中兴圈地IPTV金矿 中小企业南柯一梦
  7. 分糖果(信息学奥赛一本通-T1380)
  8. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard
  9. 5 Java NIO Scatter 与Gather-翻译
  10. 安卓recovery如何传递启动参数
  11. matlab-画折线图
  12. lisp天正图元位置修改_关于图元改层的,请求大佬帮助 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  13. EXCEL技能1:SUMIFS 小白详解
  14. P1757 通天之分组背包(动态规划 分组背包)
  15. c++中的有符号数与无符号数一起运算
  16. [闻缺陷则喜]编码与实现方式
  17. 做人,该善良时就善良,该勇敢时就要有勇气去对应
  18. 啊哈C——学习3.6一起来找茬
  19. 多元线性回归之Spss实现
  20. 这样理解mmap,挺有意思!

热门文章

  1. 苹果Airplay协议以及AirTunes流程总结
  2. AutoJs UI版
  3. 二战中真实的打酱油船
  4. 删除计算机自带的游戏软件,win10系统删除自带游戏的处理办法
  5. html中js正则表达式手机,js验证电话号码与手机支持+86的正则表达式
  6. 安装python包的时候文件夹权限报错:InvalidArchiveError(“Error with archive D:\\anaconda\\pkgs\\cudnn-8.4.1.50-h)
  7. 我的AI转型之路与AI之我见(非985211的奋斗路程与视角)
  8. 盘点国内优秀的机器人公司
  9. 【Python爬虫案例学习21】爬取某站上海租房图片
  10. app上架360手机助手流程