[版权申明]非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86644481
出自:shusheng007
设计模式汇总篇,一定要收藏:
前言
人在IT江湖飘,不懂设计模式咋装X?
今天让我们一起来研究一下三种工厂模式,其均为创建型模式,即讨论的是如何创建一个类的对象的问题。就是以各种高逼格的方式最终将一个类的对象new出来,一点也不神秘。如果你发现需要一个类的对象而你又不会这些装X神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装X神器!
类型
创建型(creational)
难度
4颗星
定义
对没有相关经验的同学的废话又来了:
The essence of the Abstract Factory Pattern is to “Provide an interface for creating families of related or dependent objects without specifying their concrete classes”
抽象工厂为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体类
使用场景
如果你的业务中出现了要依据不同的产品家族来生产其旗下的一系列产品的时候,抽象工厂模式就配上用场了。
例如小米公司和苹果公司就是两个不同产品家族,而他们两家都生产笔记本电脑和手机,那么小米的笔记本电脑和苹果的笔记本电脑肯定不一样,手机情况也是如此。这就构成了两个产品家族的系列产品之间比较的关系。
再比如麦当劳和肯德基是两个不同的产品家族,他们都生产汉堡和果汁。
如何实现
业务场景
今天王二狗约自己在富士康工作的老乡出来喝酒,没想到老乡最近一直在加班。听说接了个大活,要同时为小米公司和苹果公司代工他们的笔记本电脑和手机生产业务。
抽象工厂模式是三种工厂模式中最为复杂的一个,其关键在于品牌家族的概念,这里的一个工厂要生产某一个品牌家族里面的系列产品。
下图为具体案例的UML图
图中有两个产品家族 小米公司 和 苹果公司 ,每个产品家族中包含两种产品,笔记本电脑与手机。
所以需要两个工厂。XiaoMiFactory
与AppleFactory
,他们都实现抽象工厂接口AbstractFactory
。
XiaoMiFactory
生产MiComputer
和MiPhoto
,AppleFactory
生产MacComputer
和IPhoto
。
其中MiComputer
和MacComputer
是同一类型的产品,都是笔记本电脑,实现同一个接口Computer
。
其中MiPhoto
和IPhoto
是同一类型的产品,都是手机,实现同一个接口MobilePhoto
。
此处就一目了然了,富士康需要两个工厂,一个工厂生产小米的笔记本电脑和手机,另一个工厂生产苹果的笔记本电脑和手机。
使用抽象工厂模式
第一步:定义一个电脑的抽象基类,里面有一个为电脑安装操作系统的抽象方法。
//电脑接口
public abstract class Computer {
public abstract void setOperationSystem();
}
public class MacComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("Mac笔记本安装Mac系统");
}
}
public class MiComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("小米笔记本安装Win10系统");
}
}
第二步:定义一个手机的抽象基类,里面有一个为手机安装操作系统的抽象方法。
//手机接口
public abstract class MobilePhoto {
public abstract void setOperationSystem();
}
public class IPhoto extends MobilePhoto {
@Override
public void setOperationSystem() {
System.out.println("苹果手机安装IOS系统");
}
}
public class MiPhoto extends MobilePhoto {
@Override
public void setOperationSystem() {
System.out.println("小米手机安装Android系统");
}
}
第三步:定义工厂类,这里的工厂不是按照具体的产品类型定义,而是按照品牌家族来定义。
例如现在有两个品牌小米和苹果,那么就需要分别为这两个品牌各定义一个工厂,每个工厂生产这个品牌家族的系列产品,例如笔记本电脑和手机。
//抽象工厂接口
public interface AbstractFactory {
Computer makeComputer();
MobilePhoto makeMobilePhoto();
}
public class AppleFactory implements AbstractFactory {
@Override
public Computer makeComputer() {
return new MacComputer();
}
@Override
public MobilePhoto makeMobilePhoto() {
return new IPhoto();
}
}
public class XiaoMiFactory implements AbstractFactory {
@Override
public Computer makeComputer() {
return new MiComputer();
}
@Override
public MobilePhoto makeMobilePhoto() {
return new MiPhoto();
}
}
第四步:使用工厂来生产产品,这里每个工厂生产的是那个品牌家族的一系列产品,而不是一个。
public static void main(String[] args) {
//使用苹果工厂生产苹果公司的系列产品
AbstractFactory appleFactory=new AppleFactory();
appleFactory.makeComputer().setOperationSystem();
appleFactory.makeMobilePhoto().setOperationSystem();
//使用小米工厂生产小米公司的系列产品
AbstractFactory miFactory=new XiaoMiFactory ();
miFactory.makeComputer().setOperationSystem();
miFactory.makeMobilePhoto().setOperationSystem();
}
理解抽象工厂模式的核心关键在于理解品牌家族的概念,简单工厂方法与工厂方法创建工厂的着眼点为某类具体的产品,某个工厂与某个产品对应,而抽象工厂某个工厂与产品的家族对应,这个工厂可以生产这个品牌家族的一系列产品。
抽象工厂模式技术要点总结
- 要准确识别出当前场景是在构建哪些产品家族的系列产品对象。
- 每个产品家族的产品系列都要在 AbstractFactory 接口里面定义
总结
总的来说此模式在日常开发中使用频率不高,但关键时刻是能起大作用的。
设计模式值得你可以练习!
GitHub源码地址:design-patterns
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14762.html