N+1
假设目前你的程序里面有三个对象IphoneX、IphoneXs、IphoneXR的尺寸,那么你使用工厂模式就已经足够了,因为她们属于同一个品类,都属于苹果,如果在添加一个IPhone2022产品,也只需要把IPhone2022加入到你的苹果工厂里面就够了。
但是如果你程序里面还需要知道华为mate10或者小米8的尺寸。这时候你怎么来创建这些对象呢?这时候工厂模式明显已经不适用了,因为工厂模式是对象都实现了同一个接口,这时候就可以使用抽象工厂模式了。
抽象工工厂模式和工厂模式的区别:
抽象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
工厂方法模式的定义:为某个对象提供一个接口,而且无需指定它们的具体类。
都是子类实现接口的方法,并在子类写具体的代码。
工厂方法模式中也是可以有多个具体工厂,也是可以有多个抽象产品,和多个具体工厂、具体产品类。
是在抽象工厂接口类中,能创建几个产品对象。
抽象工厂模式的工厂能创建多个相关的产品对象,而工厂方法模式的工厂只创建一个产品对象。
什么是抽象工厂模式?
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
结构图
应用场景
当创建的对象是一系列相互关联或相互依赖的产品族时,如华为手机、华为平板、华为电脑
系统中有多个产品族,但每次只使用其中一族的产品,如李宁、耐克、阿迪,但有些人只穿李宁牌子的服装和鞋子
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构,如输入法皮肤 要换就整套换
优缺点
难以支持新种类的产品。
抽象方法模式的最大缺点就是产品族本身的扩展非常困难。如果在产品族中增加一个新的产品类型,则需要修改多个接口,并影响现已有的工厂类。
代码
抽象类
//抽象产品:咖啡类 public abstract class Coffee { public abstract void show(); } //抽象产品:甜品类 public abstract class Dessert { public abstract void show(); }
具体类
//具体产品:美式咖啡 public class AmericanCoffee : Coffee { public override void show() {Console.WriteLine("美式咖啡"); } } //具体产品:拿铁咖啡 public class LatteCoffee : Coffee { public override void show() { Console.WriteLine("拿铁咖啡"); } } //具体产品:提拉米苏 public class Trimisu : Dessert { public override void show() { Console.WriteLine("提拉米苏"); } } //具体产品:抹茶慕斯 public class MatchMousse : Dessert { public override void show() { Console.WriteLine("抹茶慕斯"); } }
接口
public interface IFactory { Coffee createCoffee();//生产咖啡 Dessert createDessert();//擅长甜品 }
两个饭店
//美式风味工厂 生产美式咖啡和抹茶慕斯 class AmericanFlavorFactory : IFactory { public Coffee createCoffee() { return new AmericanCoffee(); } public Dessert createDessert() { return new MatchMousse(); } } //意大利风味工厂 生产拿铁咖啡和提拉米苏 class ItalyFlavorFactory : IFactory { public Coffee createCoffee() { return new LatteCoffee(); } public Dessert createDessert() { return new Trimisu(); } }
客户端
AmericanFlavorFactory factory = new AmericanFlavorFactory(); //小张喜欢美式美味的食物 Coffee coffee = factory.createCoffee(); Dessert dessert = factory.createDessert(); coffee.show(); dessert.show();