Head First设计模式之抽象工厂模式
一、定义
给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
1)系统中有多个产品族,而系统一次只可能消费其中一族产品。
2)同属于同一个产品族的产品以其使用。
二、结构
抽象工厂模式的各个角色(和工厂方法一样):
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
三、实现
namespace DesignPatterns.AbstractFactory { class Program { static void Main(string[] args) { IAbstractFactory factory = null; factory = new XiaomiFactory(); factory.ProductMobile(); factory.ProductMp3(); factory = new HuaweiFactory(); factory.ProductMobile(); factory.ProductMp3(); } } public abstract class AbstractProduct { } public abstract class Mobile : AbstractProduct { } public class XiaomiMobile : Mobile { } public class HuaweiMobile : Mobile { } public abstract class Mp3 : AbstractProduct { } public class XiaomiMp3 : Mp3 { } public class HuaweiMp3 : Mp3 { } public interface IAbstractFactory { Mobile ProductMobile(); Mp3 ProductMp3(); } public class XiaomiFactory : IAbstractFactory { public Mobile ProductMobile() { Console.WriteLine("生产小米手机."); return new XiaomiMobile(); } public Mp3 ProductMp3() { Console.WriteLine("生产小米MP3."); return new XiaomiMp3(); } } public class HuaweiFactory : IAbstractFactory { public Mobile ProductMobile() { Console.WriteLine("生产华为手机."); return new HuaweiMobile(); } public Mp3 ProductMp3() { Console.WriteLine("生产华为MP3."); return new HuaweiMp3(); } } }
四、适用场景
1、QQ 换皮肤,一整套一起换。
2、生成不同操作系统的程序。
五、优缺点
优点:
抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性
欢迎阅读本系列文章:Head First设计模式之目录