网站首页 > 教程分享 正文
前言
在使用之前,我们可以简单了解一下什么是抽象工厂模式,抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
那么如何理解呢?前文提到的工厂方法模式可以理解为针对一个产品系列的,而抽象工厂模式是针对多个产品系列的。
如何理解抽象工厂模式
概念我相信大家了解了一些,我们可以通过实例从代码中更加深刻体现抽象工厂模式。还记得之前提过工厂模式的核心四个角色吗(抽象工厂、具体工厂、抽象产品、具体产品)。
- 抽象工厂接口,我们使用实例新增家电工厂,里面有两个产品方法 空调和冰箱
public interface IApplianceFactory
{
// 空调
IAirConditionerProduct AirConditioner();
// 冰箱
IRefrigeratorProduct Refrigerator();
}
复制代码
- 具体工厂继承抽象工厂,实现抽象方法,创建具有特定产品的实例,如格力工厂、美的工厂,每个具体工厂中都会包含一个相应的产品变体
// 具体工厂 格力工厂
public class GreeFactory : IApplianceFactory
{
public IAirConditionerProduct AirConditioner()
{
return new GreeAirConditionerProduct();
}
public IRefrigeratorProduct Refrigerator()
{
return new GreeRefrigeratorProduct();
}
}
// 具体工厂 美的工厂
public class MideaFactory : IApplianceFactory
{
public IAirConditionerProduct AirConditioner()
{
return new MideaAirConditionerProduct();
}
public IRefrigeratorProduct Refrigerator()
{
return new MideaRefrigeratorProduct();
}
}
复制代码
- 抽象产品接口,是构成系列产品的产品接口声明,如冰箱有(四门、双开门),空调有(立式、中央空调)
public interface IRefrigeratorProduct
{
// 双门冰箱
void DoubleDoorRefrigerator();
// 四门冰箱
void FourDoorRefrigerator();
}
public interface IAirConditionerProduct
{
// 立式空调
void FloorAirConditioner();
// 中央空调
void CentralAirConditioning();
}
复制代码
- 具体产品,是抽象产品的多种不同类型实现,里面包含的是客户端(业务)所需要的东西
// 美的具体产品实现
public class MideaRefrigeratorProduct : IRefrigeratorProduct
{
public void DoubleDoorRefrigerator()
{
Console.WriteLine("美的双门冰箱真香");
}
public void FourDoorRefrigerator()
{
Console.WriteLine("美的四门冰箱真香");
}
}
public class MideaAirConditionerProduct : IAirConditionerProduct
{
public void FloorAirConditioner()
{
Console.WriteLine("美的立式空调真舒服");
}
public void CentralAirConditioning()
{
Console.WriteLine("美的中央空调真舒服");
}
}
// 格力具体产品实现
public class GreeRefrigeratorProduct : IRefrigeratorProduct
{
public void DoubleDoorRefrigerator()
{
Console.WriteLine("格力双门冰箱真香");
}
public void FourDoorRefrigerator()
{
Console.WriteLine("格力四门冰箱真香");
}
}
public class GreeAirConditionerProduct : IAirConditionerProduct
{
public void FloorAirConditioner()
{
Console.WriteLine("格力立式空调真舒服");
}
public void CentralAirConditioning()
{
Console.WriteLine("格力中央空调真舒服");
}
}
复制代码
- 客户端调用
以上是抽象工厂方法的具体实现,不难看出,当客户端想要使用Gree格力产品的时候,我们只需要修改IApplianceFactory product = new GreeFactory(); 即可实现,客户端与具体产品解耦。
总结
针对上述例子如果需要引用更多的厂商如 海尔 呢?
- 新增实现类HaierAirConditionerProduct继承IAirConditionerProduct
- 新增工厂HaierFactory继承IApplianceFactory即可
客户需求变更,需要更多的产品如 洗衣机 代码会做出什么改变?
- 添加抽象产品接口IWashingMachineProduct
- 添加具体产品实现类GreeWashingMachineProduct,MideaWashingMachineProduct
- 集成到工厂接口
优点
在客户端调用的时候根本看不到具体产品使用的是Gree还是Midea,是的客户端与具体产品实现解耦。 只需要在应用开始的时候创建一次,这样就让我们改动具体工厂变得非常的容易,并且能够保证客户端始终只使用同一个工厂中的对象。
缺点
对于涉及到多个产品组(美的、格力)与多个产品等级(空调、冰箱)结构的系统,增加新的产品族,工厂方法不用修改原有代码,只需要扩展新增即可,遵循了开闭原则!但是在新增新的产品等级的时候需要修改原有代码,无法遵循开闭原则。 采用该模式会新增更多的接口和类,会使系统更加抽象,代码更加复杂
当然针对上面所遇到的问题,之前我也看过一些书籍,也有方法来解决,如使用简工厂模式来改进抽象工厂模式等等,大家在使用的时候也要去深入研究是否适用,如果不是最佳实践那么只能使系统愈加复杂。
猜你喜欢
- 2024-10-18 设计模式之 抽象工厂(抽象工厂模式的简单应用)
- 2024-10-18 Aha!设计模式(3)-抽象工厂(2)(抽象工厂模式结构图)
- 2024-10-18 Java经典设计模式-抽象工厂模式(抽象工厂模式在spring的应用)
- 2024-10-18 Java高级编程细节——工厂模式之抽象工厂
- 2024-10-18 java与设计模式-简单工厂-工厂方法-抽象工厂
- 2024-10-18 简单工厂,工厂方法,抽象工厂(简单工厂,工厂方法,抽象工厂区别)
- 2024-10-18 Aha!设计模式(1)-抽象工厂(1)(抽象工厂实例)
- 2024-10-18 抽象工厂模式(Abstract Factory)(抽象工厂模式的意图是)
- 2024-10-18 设计模式记录-抽象工厂模式(抽象工厂模式与工厂方法模式)
- 2024-10-18 你还在new对象吗?用个“抽象工厂模式”生产对象它不香吗
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)