创建型设计模式之抽象工厂模式

xiaoxiao2021-02-28  25

抽象工厂模式

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。抽象工厂模式和工厂模式的区别在于:工厂模式中的每一个产品都来自同一个产品结构(同一接口或抽象类),工厂模式一个工厂只生产一个产品;抽象工厂模式的每一个产品都来自不同的产品结构(不同的接口或抽象类),但它们都属于同一个产品族(位于不同产品等级结构中功能相关联的产品组成的家族),比如两个手机生产厂家都生产3G\4G手机,同一厂家的3G、4G手机同属于一个产品结构,都来自一个厂商。但是另一个划分是用3G\4G进行划分。3G手机来自两个厂家(这时3G手机就是一个产品族,对于4G手机也是一个产品族),抽象工厂模式 –> 一个工厂可以 生产 产品族当中的 一系列产品

具体实现:

1.定义产品接口(也可以时抽象类),每个接口提供了不同的产品规范,但存在有共性的东西;2.定义产品实现类,继承产品接口,实现产品规范,不同的产品定义不同的实现类;3.按产品族定义工厂接口(也可以是抽象类),该族中的每个产品类都有对应的实例化方法声明;4.定义实现工厂接口的实现类,完成产品的实例化工作。

以上内容来自《软件工程导论》

更具体的例子:

比如富士康要为小米公司和苹果公司生产手机.要生产的产品有小米公司的小米5、小米6,苹果公司的IPhone5、IPhone6。由于市场需求旺盛富士康准备在两个工厂:富士康(北京),富士康(上海)同时生产. 这时候就可以把小米的手机产品进行规范化处理定义接口IProductXiaomi,小米5抽象成ProductXiaomi5,小米6抽象成ProductXiaomi6.把苹果的手机产品进行规范化处理定义接口IProductIPhone,IPhone5抽象成ProductIPhone5,IPhone6抽象成ProductIPhone6.由于富士康(北京)属于富士康(华北),所以将富士康(华北)规范化处理为IFactoryNorth,而富士康(上海)属于富士康(华东),所以将富士康(华东)规范化处理为IFactoryEast而富士康(北京)就是FactoryBeijing,富士康(上海)就是FactoryShanghai.富士康(北京)负责生产小米5和IPhone5,而富士康(上海)负责生产小米6和IPhone6富士康总部生产手机时就可以用富士康(北京)FactoryBeijing去实例化富士康(华北)IFactoryNorth类型的实例factoryBeijing.接着让富士康(北京)factoryBeijing调用自身的生产产品的方法(例如:CreateProductXiaomi5())去实例化相应的产品..同理,富士康(上海)也一样.

C#语言实现

using System; namespace AbstractFactoryPattern { #region 产品 // 产品一的接口 public interface IProductA { void ProductMethod(); } // 产品二的接口 public interface IProductB { void ProductMethod(); } // 产品一的A1型号产品 public class ProductA1 : IProductA { public void ProductMethod(){ Console.WriteLine("我是产品一中的A1型产品"); } } // 产品一的A2型号产品 public class ProductA2 : IProductA { public void ProductMethod() { Console.WriteLine("我是产品一中的A2型产品"); } } // 产品二的B1型号产品 public class ProductB1 : IProductB { public void ProductMethod() { Console.WriteLine("我是产品二中的B1型产品"); } } // 产品二的B2型产品 public class ProductB2 : IProductB { public void ProductMethod() { Console.WriteLine("我是产品二中的B2型产品"); } } #endregion #region 工厂 // 工厂一的接口 public interface IFactoryA { IProductA CreateProductA1(); IProductB CreateProductB1(); } // 工厂二的接口 public interface IFactoryB { IProductA CreateProductA2(); IProductB CreateProductB2(); } // 工厂一 public class FactoryA:IFactoryA { // 负责生产工厂一中的产品一的A1型产品 public IProductA CreateProductA1() { return new ProductA1(); } // 负责生产工厂二中的产品二的B1型产品 public IProductB CreateProductB1() { return new ProductB1(); } } // 工厂二 public class FactoryB : IFactoryB { // 负责生产工厂二中的产品一中的A2型产品 public IProductA CreateProductA2() { return new ProductA2(); } // 负责生产工厂二中的产品二中的B2型产品 public IProductB CreateProductB2() { return new ProductB2(); } } #endregion #region 使用者 class Program { static void Main(string[] args) { // 工厂一 IFactoryA factoryA = new FactoryA(); IProductA productA1 = factoryA.CreateProductA1(); IProductB productB1 = factoryA.CreateProductB1(); productA1.ProductMethod(); productB1.ProductMethod(); // 工厂二 IFactoryB factoryB = new FactoryB(); IProductA productA2 = factoryB.CreateProductA2(); IProductB productB2 = factoryB.CreateProductB2(); productA2.ProductMethod(); productB2.ProductMethod(); } } #endregion }
转载请注明原文地址: https://www.6miu.com/read-2627657.html

最新回复(0)