解决的问题:
- 如何创建一个类,使其能够独立于它所需要的对象
- 如何让相关的产品对象能够一同被创建
怎么去解决:
- 将一系列具体对象的创建封装在单独的工厂对象里,你需要定义这个工厂的接口,然后实现这个抽象的工厂
- 客户端上下文在调用时,通过工厂去创建抽象的产品从而代替直接创建具体的产品对象
定义:
我想抽象工厂的核心定义是提供一个接口,用于创建一组依赖的对象(接口),并且无需指定具体的实现对象
具体的工厂决定了怎样的一系列具体对象会被创建,方法所返回的将是一个抽象的产品接口类型。在运行时上下文中,客户端将依赖于这个抽象的产品接口指针,而不用关心具体的实现提供者是什么。
UML:
实例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { public interface IButton { } public class FerricButton : IButton { } public class PlasticButton : IButton { } public interface IDisplayPanel { } public class LCDDisplayPanel : IDisplayPanel { } public class LEDDisplayPanel : IDisplayPanel { } public interface IDisplayerFactory { IButton CreateButton(); IDisplayPanel CreateDisplayPanel(); } public class HighendDisplayerFactory : IDisplayerFactory { public IButton CreateButton() { return new FerricButton(); } public IDisplayPanel CreateDisplayPanel() { return new LEDDisplayPanel(); } } public class LowendDisplayerFactory : IDisplayerFactory { public IButton CreateButton() { return new PlasticButton(); } public IDisplayPanel CreateDisplayPanel() { return new LCDDisplayPanel(); } } internal class Program { private static void Main(string[] args) { DoWork(); } private static void DoWork() { IDisplayerFactory displayerFactory; while (true) { Console.WriteLine("Please select the type of displayer you want."); Console.WriteLine($"A: LED{Environment.NewLine}B: LCD"); var inputKey = Console.ReadKey(); Console.WriteLine(); switch (inputKey.KeyChar.ToString().ToUpper()) { case "A": displayerFactory = new HighendDisplayerFactory(); Console.WriteLine($"Producing button -- {displayerFactory.CreateButton()}"); Console.WriteLine($"Producing display panel -- {displayerFactory.CreateDisplayPanel()}"); break; case "B": displayerFactory = new LowendDisplayerFactory(); Console.WriteLine($"Producing button -- {displayerFactory.CreateButton()}"); Console.WriteLine($"Producing display panel -- {displayerFactory.CreateDisplayPanel()}"); break; case "X": return; default: Console.WriteLine("You enter a wrong character and enter 'x' to exit the program"); break; } } } } }
One Reply to “抽象工厂模式(Abstract Factory Pattern)-创建型模式第二篇”