创建型设计模式。为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
工厂模式
创建一个人
1Person p = new Person();创建一个男人
1Person p = new Man();创建一个女人
1Person p = new Woman();封装变化点
1234567891011Person p = PersonFactory.GetPerson();public class PersonFactory{public static Person GetPerson(){//需要什么实例,修改并返回所需实例//reutrn new Person();//return new Man();return new Woman();}}
工厂模式创建一系列相互依赖的对象
调用
123456//路Road r = SkinFactory.GetRoad();//建筑物Building b = SkinFactory.GetBuilding();//丛林Jungle j = SkinFactory.Jungle();定义
1234567891011121314151617181920212223242526public class SkinFactory(){public static Road GetRoad(){//水泥路return new WaterRoad();//高速公路//return new Highway();}public static Building GetBuilding(){//居民楼return new ResidentBuilding();//办公楼//return new OfficeBuilding();}public static Jungle GetJungle(){//绿色丛林return new GreenJungle();//黄色森林(荒野)//return new YellowJungle();}}
抽象工厂
一个游戏,需要经常变换游戏场景,比如,第一个月是经典场景,第二月换为现代场景…如此看来,场景是变化点,需要对场景进行封装。也就是对上一个例子的SkinFactory进行抽象封装。(设计很大部分都是为了扩展,而非修改)
场景抽象类
123456789public abstract class Road{}public abstract class Building{}public abstract class Jungle{}public abstract class SkinFactory{public abstract Road GetRoad();public abstract Building GetBuilding();public abstract Jungle GetJungle();}经典场景实现类
123456789101112131415161718public class WaterRoad:Road{}public class ResidentBuilding:Building{}public class GreenJungle:Jungle{}public class ClassicSkinFactory:SkinFactory{public override Road GetRoad(){return new WaterRoad();}public override Building GetBuilding(){return new ResidentBuilding();}public override Jungle GetJungle(){return new GreenJungle();}}现代场景实现类
123456789101112131415161718public class Highway:Road{}public class OfficeBuilding:Building{}public class YellowJungle:Jungle{}public class ModernSkinFactory:SkinFactory{public override Road GetRoad(){return new Highway();}public override Building GetBuilding(){return new OfficeBuilding();}public overide Jungle GetJungle(){return new YellowJungle();}}客户端调用
12345678910void Main(){//实例化SkinFactorySkinFactory skinFactory = new ClassicSkinFactory();//实际调用ClassicSkinFactory.GetRoad()Road r = skinFactory.GetRoad();Building b = skinFactory.GetBuilding();Jungle j = skinFactory.GetJungle();}