Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
2017-10-26 17:38
387 查看
一、概述
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
UML图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/0a2c1246aad70285229cb9ce307289ec.png)
其他的过多概念不再这里赘述,不如通过例子来实际感受与体会
二、实践
关键是搞清等级族的概念,这里以生产手机为例,假设生产小米5和小米6两个型号的手机,两个手机都有内存和处理器,但是内存和处理器的组合不同:米5采用的是骁龙820+16G内存组合,而米6则是骁龙835+32G组合。生产对应产品的时候就会匹配对应的产品部件组合,不会出现米5的骁龙835+16G等
的配置。
看问题的角度也要发生变化,比如耐克有男鞋女鞋,乔丹有男鞋女鞋,可以按照品牌分为耐克、乔丹;也可以按照性别分为男鞋、女鞋。
抽象工厂(生产内存和处理器,由纵向改为了横向)
/** * 抽象工厂 * 作者: Administrator * 日期: 2017/10/26 **/ public interface AbstractFactory { Memory createMemory(); Processor createProcessor(); }
抽象产品1(内存)
/** * 内存接口 * 作者: Administrator * 日期: 2017/10/26 **/ public interface Memory { }
具体产品1。1(16G内存)
/** * 16G内存 * 作者: Administrator * 日期: 2017/10/26 **/ public class Memory16 implements Memory{ public Memory16() { System.out.println("16GB内存"); } }
具体产品1.2(32G内存)
/** * 32G内存 * 作者: Administrator * 日期: 2017/10/26 **/ public class Memory32 implements Memory{ public Memory32() { System.out.println("32GB内存"); } }
抽象产品2(处理器)
/** * 处理器接口 * 作者: Administrator * 日期: 2017/10/26 **/ public interface Processor { }
具体产品2.1(820处理器)
/** * 骁龙820 * 作者: Administrator * 日期: 2017/10/26 **/ public class Processor820 implements Processor{ public Processor820() { System.out.println("骁龙820"); } }
具体产品2.2(835处理器)
/** * 骁龙835 * 作者: Administrator * 日期: 2017/10/26 **/ public class Processor835 implements Processor{ public Processor835() { System.out.println("骁龙835"); } }
具体工厂类1(生产米5,自动匹配配置)
/** * 小米5的工厂 * 作者: Administrator * 日期: 2017/10/26 **/ public class Mi5Factory implements AbstractFactory{ @Override public Memory createMemory() { return new Memory16(); } @Override public Processor createProcessor() { return new Processor820(); } }
具体工厂类2(生产米6,自动匹配配置)
/** * 米6的工厂 * 作者: Administrator * 日期: 2017/10/26 **/ public class Mi6Factory implements AbstractFactory{ @Override public Memory createMemory() { return new Memory32(); } @Override public Processor createProcessor() { return new Processor835(); } }
客户端的使用:
/** * 客户端 * 作者: Administrator * 日期: 2017/10/26 **/ public class Client { public static void main(String[] args) { Mi5Factory mi5Factory = new Mi5Factory(); mi5Factory.createMemory(); mi5Factory.createProcessor(); Mi6Factory mi6Factory = new Mi6Factory(); mi6Factory.createMemory(); mi6Factory.createProcessor(); } }
三、改进与思考
对开闭原则的支持以上述例子为例,需要增加新的配置组合,比如增加骁龙835+16G的组合(增加产品族),则符合开闭原则,只是拓展,无需修改
而如果需要增加一个新的产品等级结构(比如增加双摄),则所有工厂都需要改变;故抽象工厂模式部分支持开闭原则!
如知乎网友所说:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/726e6933ccacb7d802fd539a807daf0b.png)
四、工厂模式小结
学习设计模式,很重要的一点是为什么要用这个设计模式,哪些地方要用这个设计模式。我们先来看来自百度知道的网友的提问:![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/516f0b3dfe7fb1654308003adf85b389.png)
我们看最佳答案怎么说的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/e7f742f2e718868c7fa00aa50c9d1c32.png)
这里面的重点单词是:解耦!
还有一个很重要的一点是前面的六大原则的基本原则——“开闭原则”,尽量不要改老代码,而是添代码!
综上:
工厂模式可以隐藏创建的细节,隐藏了具体类名后续如果想换掉不会影响调用者
归一化的修改
调用者不关心创建细节,只针对接口编程(依赖抽象而非依赖具体)
相关文章推荐
- JAVA设计模式(02):创建型-抽象工厂模式(Abstract Factory)
- java语言实现创建型设计模式—抽象工厂模式
- Java与设计模式(十一)创建型--抽象工厂模式
- Java设计模式_(创建型)_抽象工厂模式
- JAVA设计模式(02):创建型-抽象工厂模式(Abstract Factory)
- JAVA设计模式(02):创建型-抽象工厂模式(Abstract Factory)
- java创建型设计模式——抽象工厂模式
- Java设计模式(2)创建型:工厂模式(工厂方法模式与抽象工厂模式)
- JAVA设计模式(2) —<创建型>抽象工厂模式(Abstract Factory)
- java设计模式之创建型模式-抽象工厂模式
- java设计模式(创建型)之抽象工厂模式
- Java经典设计模式-创建型模式-抽象工厂模式(Abstract Factory)
- Java设计模式之创建型模式-抽象工厂模式(Abstract Factory)
- JAVA设计模式(5) —<创建型>原型模式(Prototype)
- 设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 单例模式(Singleton Pattern) - Java实现
- Java经典设计模式之五大创建型模式(附实例和详解)
- java设计模式 -------- 创建模式 之 抽象工厂模式
- java创建型设计模式——单例模式
- Java设计模式之四:抽象工厂模式
- Java设计模式--简单工厂、工厂、抽象工厂模式