Edit(2023 3.10) :前几天上设计模式课,老师说了这么一句话,在此记录:
设计模式就是把变化的抽象出来
工厂模式在游戏制作中也是广泛应用,目的在于解耦创建者和被创建者。
在此自己手写我们的可乐工厂加深理解,可乐对象结构如下
1 2 3 4 5 6 7 8 9 10 11
| public interface Cola{}
public class Pepsi :Cola { }
public class Coke :Cola { }
public class Diet :Cola { }
|
简单工厂
静态简单工厂:无需创建工厂实例,switch实现
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class ColaFactory { public static Cola CreateCola(string name) { switch (name) { case "Coke": return new Coke(); case "Pepsi": return new Pepsi(); case "Diet": return new Diet(); default: throw new Exception(); } } }
|
泛型简单工厂
1 2 3 4 5 6 7
| public class ColaCreator<T> where T : Cola, new() { public T CreateCola() { return new T(); } }
|
缺点:无法具体处理不同类型可乐的初始化参数
普通工厂
新加条件,百事可乐有瓶装罐装之分,容量,价格,风味各不相同,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Pepsi :Cola { string tag; int capacity; float price; int flavour; public Pepsi(string tag="can", int capacity=300, float price=2.5f, int flavour = 0) { this.tag = tag; this.capacity = capacity; this.price = price; this.flavour = flavour; } }
|
此时简单工厂将无法满足需求,改为如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public abstract class ColaCreator<T> where T : Cola { public abstract T CreateBottleCola(); public abstract T CreateCanCola(); }
public class PepsiFactory : ColaCreator<Pepsi> { public override Pepsi CreateBottleCola() { return new Pepsi(tag:"bottle",capacity: 600, price: 3f); }
public override Pepsi CreateCanCola() { return new Pepsi(); } }
|
抽象工厂
抽象工厂目的在于帮助工厂处理一系列相关的对象,而不同于普通工厂专注创建一个对象的实例。
新加条件,现在需要两个工厂A,B分别创建联合装可乐A,B,联合装A包含健怡可乐,可口可乐和罐装百事,联合装B只包含健怡可乐和可口可乐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public abstract class AbstractFactory { public abstract Pepsi CreatePepsi(); public abstract Coke CreateCoke(); public abstract Diet CreateDiet(); }
public class ColaFactoryA : AbstractFactory { public override Coke CreateCoke() { return new Coke(); }
public override Diet CreateDiet() { return new Diet(); }
public override Pepsi CreatePepsi() { return new Pepsi(capacity: 600, price: 3f); new mbox } }
public class ColaFactoryB : AbstractFactory { public override Coke CreateCoke() { return new Coke(); }
public override Diet CreateDiet() { return new Diet(); }
public override Pepsi CreatePepsi() { return null; } }
|