前言:
视频教程:狂神说Java之通俗易懂的23种设计模式
什么是设计模式?
- 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。
它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的
解决方案.- 1995年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软
件的基础》一书,共收录了23种设计模式,从此树立了软件设计模式领域的里程碑,人称 【GoF设计模式】- GoF23: 一种思维,一种态度,一种进步
设计模式分类:
设计模式分类 具体模式 创建型模式 ⌛单例模式、⌛工厂模式、⌛抽象工厂模式、建造者模式、原型模式 结构型模式: 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 行为型模式: 模板方法模、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式
抽象工厂模式
围绕着一个超级工厂创建其他工厂,该超级工厂又称作其他工厂的工厂[
1.介绍
-
定义:
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
-
适用场景:
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现
-
优点:
- 具体产品在应用层的代码隔离,无需关心创建的细节
- 将一个系列的产品统一到一起创建
-
缺点:
- 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难;
- 增加了系统的抽象性和理解难度
-
产品族与产品等级:
相关博客:产品等级结构与产品组族
(1) 产品等级结构:
产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
(2) 产品族:
在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
简单来说(个人理解):
-
产品等级:
同类型产品:小米手机、华为手机 都是手机
-
产品族:
同一品牌的产品:华为路由器、华为手机都是华为公司的产品
-
2.代码实例
- 产品等级(产品类型):手机、路由器
- 手机接口
/**
* 手机产品接口
*/
public interface IPhoneProduct {
//开机方法
void start();
//关机方法
void shutdown();
//打电话
void callup();
//发信息
void sendMessage();
}
-
手机产品:
- 华为手机
public class HuaweiPhone implements IPhoneProduct { @Override public void start() { System.out.println("开启华为手机"); } @Override public void shutdown() { System.out.println("关闭华为手机"); } @Override public void callup() { System.out.println("用华为手机打电话"); } @Override public void sendMessage() { System.out.println("用华为手机发短信"); } }
- 小米手机
public class XiaomiPhone implements IPhoneProduct { @Override public void start() { System.out.println("开启小米手机"); } @Override public void shutdown() { System.out.println("关闭小米手机"); } @Override public void callup() { System.out.println("用小米手机打电话"); } @Override public void sendMessage() { System.out.println("用小米手机发短信"); } }
-
路由器接口
//路由器产品
public interface IRouterProduct {
//开机方法
void start();
//关机方法
void shutdown();
//打电话
void openWifi();
//发信息
void setting();
}
-
路由器产品:
- 华为路由器
public class HuaweiRouter implements IRouterProduct { @Override public void start() { System.out.println("启动华为路由器"); } @Override public void shutdown() { System.out.println("关闭华为路由器"); } @Override public void openWifi() { System.out.println("打开华为路由器wifi"); } @Override public void setting() { System.out.println("打开华为路由器设置"); } }
- 小米路由器
public class XiaomiRouter implements IRouterProduct{ @Override public void start() { System.out.println("启动小米路由器"); } @Override public void shutdown() { System.out.println("关闭小米路由器"); } @Override public void openWifi() { System.out.println("打开小米路由器wifi"); } @Override public void setting() { System.out.println("打开小米路由器设置"); } }
-
产品族(品牌工厂):
- 总工厂(管理品牌工厂)
//抽象产品工厂 public interface IProductFactory { //生产手机 IPhoneProduct PHONE_PRODUCT(); //生产路由器 IRouterProduct ROUTER_PRODUCT(); }
-
子工厂(具体生产产品的工厂)
- 华为工厂:
public class HuaweiFactory implements IProductFactory { @Override public IPhoneProduct PHONE_PRODUCT() { return new HuaweiPhone(); } @Override public IRouterProduct ROUTER_PRODUCT() { return new HuaweiRouter(); } }
- 小米工厂:
public class XiaomiFactory implements IProductFactory { @Override public IPhoneProduct PHONE_PRODUCT() { return new XiaomiPhone(); } @Override public IRouterProduct ROUTER_PRODUCT() { return new XiaomiRouter(); } }
-
消费者:
public class Client { public static void main(String[] args) { System.out.println("============小米工厂============"); XiaomiFactory xiaomiFactory = new XiaomiFactory(); IPhoneProduct phoneProduct = xiaomiFactory.PHONE_PRODUCT(); phoneProduct.start(); phoneProduct.sendMessage(); IRouterProduct routerProduct = xiaomiFactory.ROUTER_PRODUCT(); routerProduct.start(); routerProduct.openWifi(); System.out.println("============华为工厂============"); HuaweiFactory huaweiFactory = new HuaweiFactory(); IPhoneProduct phoneProduct_huawei = huaweiFactory.PHONE_PRODUCT(); phoneProduct_huawei.start(); phoneProduct_huawei.sendMessage(); IRouterProduct routerProduct_huawei = huaweiFactory.ROUTER_PRODUCT(); routerProduct_huawei.start(); routerProduct_huawei.openWifi(); } }
============小米工厂============ 开启小米手机 用小米手机发短信 启动小米路由器 打开小米路由器wifi ============华为工厂============ 开启华为手机 用华为手机发短信 启动华为路由器 打开华为路由器wifi
概览图:
工厂模式小结:
-
简单工厂模式(静态工厂模式)
虽然某种程度上不符合设计原则,但实际使用最多!
-
工厂方法模式
不修改已有类的前提下,通过增加新的工厂类实现扩展.
-
抽象工厂模式
不可以增加产品,可以增加产品族!
应用场景:
-
JDK中Calendar的getinstance方法
-
JDBC中的Connection对象的获取
-
Spring中IOC容器创建管理bean对象
-
反射中Class对象的newlnstance方法