设计模式之抽象工厂
Posted amcomputer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之抽象工厂相关的知识,希望对你有一定的参考价值。
1 背景回顾
设计模式是一种思维方式,前人总结的最佳实践,也是一种态度,一种进步。
软件过程里面设计模式一共有23种,一般分为3类。即创建型,结构性型,行为型。其中:
****创建型5种: **** 解决了创建对象的烦恼
单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
结构性型7种: 解决了如何让类组合起来完成复杂的功能
适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式,
行为型11种: 解决了类之间的控制关系。
模版方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,状态模式,策略模式,职责链模式,访问者模式,解释器模式。
如果想要学习并掌握这些设计模式,最好是编码和画图理解。
简单工厂:## 1 背景回顾
设计模式是一种思维方式,前人总结的最佳实践,也是一种态度,一种进步。
软件过程里面设计模式一共有23种,一般分为3类。即创建型,结构性型,行为型。其中:
**创建型5种: ** 解决了创建对象的烦恼
单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
结构性型7种: 解决了如何让类组合起来完成复杂的功能
适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式,
行为型11种: 解决了类之间的控制关系。
模版方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,状态模式,策略模式,职责链模式,访问者模式,解释器模式。
如果想要学习并掌握这些设计模式,最好是编码和画图理解。
抽象工厂:简单理解,创建工厂的工厂。
2 抽象工厂
为什么需要抽象工厂?
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。
方便对工厂进行管理。简单工厂不满足开闭原则,工厂方方法虽然满足开闭原则,但是,不好管理这些工厂。
而抽象工厂则能站在更抽象的纬度,对这些工厂进行管理。
具体的实现:
定义2个接口,表示手机和路由器,
package com.yang.create.abstact;
//手机接口,
public interface IphoneProduct {
void call();//打电话
void shuntDown();//关开机
}
package com.yang.create.abstact;
//路由器接口,
public interface IrouterProduct {
void setting();//设置密码
void shuntDown();//关开机
void openWifi();//打开wifi
}
然后分别增加华为手机、路由器和小米手机、路由器来实现这2个接口:
package com.yang.create.abstact;
//华为手机
public class HuaweiPhone implements IphoneProduct {
@Override
public void call() {
System.out.println("华为手机打电话");
}
@Override
public void shuntDown() {
System.out.println("华为手机关机");
}
}
package com.yang.create.abstact;
//华为路由器
public class HuaweiRouter implements IrouterProduct {
@Override
public void setting() {
System.out.println("华为路由器设置密码");
}
@Override
public void shuntDown() {
System.out.println("华为路由关闭");
}
@Override
public void openWifi() {
System.out.println("华为路由openWifi");
}
}
小米:
package com.yang.create.abstact;
//小米手机
public class XiaomiPhone implements IphoneProduct{
@Override
public void call() {
System.out.println("小米手机打电话");
}
@Override
public void shuntDown() {
System.out.println("小米手机关机");
}
}
package com.yang.create.abstact;
//小米路由器
public class XiaomiRouter implements IrouterProduct{
@Override
public void setting() {
System.out.println("小米设置密码");
}
@Override
public void shuntDown() {
System.out.println("小米关闭");
}
@Override
public void openWifi() {
System.out.println("小米openWifi");
}
}
接下来就是最核心的了,如何实现对工厂进行管理呢?之前的我介绍的设计模式之工厂方法那篇,不能实现对工厂的管理。最直接的方法就让小米工厂和华为工厂都必须要实现这个接口才能生产出手机和路由器:
package com.yang.create.abstact;
//核心:抽象产品工厂
//只负责生产手机和路由器,而不复杂具体的类型
public interface AbstractProductFactory {
IphoneProduct getPhone();
IrouterProduct getRouter();
}
小米工厂:
package com.yang.create.abstact;
//小米工厂
public class XiaomiFactory implements AbstractProductFactory{
@Override
public IphoneProduct getPhone() {
return new XiaomiPhone();
}
@Override
public IrouterProduct getRouter() {
return new XiaomiRouter();
}
}
华为工厂:
package com.yang.create.abstact;
//华为工厂
public class HuaweiFactory implements AbstractProductFactory{
@Override
public IphoneProduct getPhone() {
return new HuaweiPhone();
}
@Override
public IrouterProduct getRouter() {
return new HuaweiRouter();
}
}
消费者测试:
package com.yang.create.abstact;
public class Consumer {
public static void main(String[] args) {
System.out.println("==================小米产品===========");
IphoneProduct xiaomiPhone = new XiaomiFactory().getPhone();
IrouterProduct xiaomiRouter = new XiaomiFactory().getRouter();
xiaomiPhone.call();
xiaomiRouter.openWifi();
System.out.println("==================华为产品===========");
IphoneProduct huaweiPhone = new HuaweiFactory().getPhone();
IrouterProduct huaweiRouter = new HuaweiFactory().getRouter();
huaweiPhone.call();
huaweiRouter.openWifi();
}
}
测试结果:
这样就能实现对产品家族的管理了,而工厂模式只能实现产品的管理。
抽象工厂目录:
3 比较理解
读到这里,可能还会觉得抽象工厂和工厂方法一样,都是通过具体的工厂去获取对象,本质上差别不大,请听笔者仔细道来,一起扣细节;
3.1相同点:
1 都是通过具体的工厂去获取对象
2 当增加新的产品时,抽象工厂和工厂方法都需要改动以前的代码
工厂方法:
抽象工厂:
3.2不同点:
抽象工厂站在产品家族的纬度,而工厂模式站在对单个产品的纬度。能生产手机和路由器,如果后续还想生产其他的,如笔记本,增加接口即可控制其他工厂。
抽象工厂:
在手机和路由器上
工厂方法:
只能生产一种产品,这个是由自己定义所决定的,工厂方法每种产品都必须要实现一个工厂。这会
导致存在很多工厂,如增加了笔记本,则一定会有特斯拉笔记本工厂。而抽象工厂则不用。
以上是关于设计模式之抽象工厂的主要内容,如果未能解决你的问题,请参考以下文章