抽象工厂模式

烂漫一生 提交于 2019-11-27 20:09:03

姓名:赵汉青

学号:07770201

 

模式名称:抽象工厂模式

1.问题描述

 

生活场景:某家具厂为学校生产课桌和座椅,开始只生产木质的课桌和座椅,后来经学校要求,又开始为学校生产铁质的课桌和座椅。

 

设计目标:实现针对多种成套产品的生产,每套产品有多种不同等级结构的物品组成。

 

 

2.不假思索的思路

思路描述:通过简单工厂的模式来实现。即在生产木质课桌的工厂里加开生产铁质课桌的生产线;在生产木质椅子的工厂里加开生产铁质椅子的生产线。

 

类结构图

缺点:这样的设计,工厂类集中了所有的实例的创建逻辑,违反了单一职责原则,即每一个类都只负责一件具体的事情;同时,当产品不断增多时,可能会出现要求工厂类根据不同条件创建不同实例的需求,工厂类就无法满足需求,不利于后续的扩充和维护。而且,这种方式割裂了产品簇之间的关系,不能体现出木桌椅或铁桌椅之间的配套关系。

代码:

abstract class Desk  //虚拟的课桌类

        {

            public abstract void produce();

        }

 

        class WoodDesk : Desk  //木课桌类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("木桌子");

            }

        }

 

        class IronDesk : Desk  //铁课桌类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("铁桌子");

            }

        }

 

        abstract class Chair  //虚拟的椅子类

        {

            public abstract void produce();

        }

 

        class WoodChair : Chair  //木椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("木椅子");

            }

        }

 

        class IronChair : Chair  //铁椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("铁椅子");

            }

        }

 

        class DeskFactory    //课桌工厂类,生产课桌

        {

            public Desk CreateDesk(string type)

            {

                switch (type.ToLower())

                {

                    case "wooddesk": return new WoodDesk();

                    case "irondesk": return new IronDesk();

                    default: return null;

                }

            }

        }

 

        class ChairFactory  //椅子工厂类,生产椅子

        {

            public Chair CreateChair(string type)

            {

                switch (type.ToLower())

                {

                    case "woodchair": return new WoodChair();

                    case "ironchair": return new IronChair();

                    default: return null;

                }

            }

        }

 

        static void Main(string[] args)

        {

            Desk desk;

            DeskFactory deskfactory = new DeskFactory();

            desk = deskfactory.CreateDesk("wooddesk");  //告诉桌子工厂生产木桌子

            desk.produce();

            desk = deskfactory.CreateDesk("irondesk");  //告诉桌子工厂生产铁桌子

            desk.produce();

 

            Chair chair;

            ChairFactory chairfactory = new ChairFactory();

            chair = chairfactory.CreateChair("woodchair"); //告诉椅子工厂生产木椅子

            chair.produce();

            chair = chairfactory.CreateChair("ironchair"); //告诉椅子工厂生产铁椅子

            chair.produce();

        }

3.归纳阶段

思路描述:通过抽象工厂模式来实现。

类结构图:

设计体会:系统对客户屏蔽了关于对象的创建,组织和表示等内容;对多于一个的产品簇进行了很好的关联;易于实现扩充。

代码:

abstract class Desk  //虚拟的课桌类

        {

            public abstract void produce();

        }

 

        class WoodDesk : Desk  //木课桌类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("木桌子");

            }

        }

 

        class IronDesk : Desk  //铁课桌类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("铁桌子");

            }

        }

 

        abstract class Chair  //虚拟的椅子类

        {

            public abstract void produce();

        }

 

        class WoodChair : Chair  //木椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("木椅子");

            }

        }

 

        class IronChair : Chair  //铁椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("铁椅子");

            }

        }

 

        abstract class Factory  //抽象的工厂类

        {

            public abstract Desk CreateDesk();

            public abstract Chair CreateChair();

        }

 

 

        class FactoryOfWood : Factory //木质品工厂,继承抽象工厂

        {

            public override Desk CreateDesk()

            {

                Console.Write("生产:");

                return new WoodDesk();

            }

 

            public override Chair CreateChair()

            {

                Console.Write("生产:");

                return new WoodChair();

            }

        }

 

        class FactoryOfIron : Factory  //铁制品工厂类,继承抽象工厂

        {

            public override Desk CreateDesk()

            {

                Console.Write("生产:");

                return new IronDesk();

            }

 

            public override Chair CreateChair()

            {

                Console.Write("生产:");

                return new IronChair();

            }

        }

 

        static void Main(string[] args)

        {

            Desk desk;

            Chair chair;

            Factory factory = new FactoryOfWood(); //实例化木制品工厂

            desk = factory.CreateDesk();

            desk.produce();

            chair = factory.CreateChair();

            chair.produce();

 

            factory = new FactoryOfIron(); //实例化铁制品工厂

            desk = factory.CreateDesk();

            desk.produce();

            chair = factory.CreateChair();

            chair.produce();

        }

4.验证阶段

 

思路描述:结合例子,增加一个产品簇:藤条课桌和藤条椅子。

类结构图

代码:

abstract class Desk  //虚拟的课桌类

        {

            public abstract void produce();

        }

 

        class WoodDesk : Desk  //木课桌类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("木桌子");

            }

        }

 

        class IronDesk : Desk  //铁课桌类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("铁桌子");

            }

        }

 

        class VineDesk : Desk  //藤条桌子类,继承课桌类

        {

            public override void produce()

            {

                Console.WriteLine("藤条桌子");

            }

        }

 

 

        abstract class Chair  //虚拟的椅子类

        {

            public abstract void produce();

        }

 

        class WoodChair : Chair  //木椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("木椅子");

            }

        }

 

        class IronChair : Chair  //铁椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("铁椅子");

            }

        }

 

        class VineChair : Chair //藤条椅子类,继承椅子类

        {

            public override void produce()

            {

                Console.WriteLine("藤条椅子");

            }

        }

 

        abstract class Factory  //抽象的工厂类

        {

            public abstract Desk CreateDesk();

            public abstract Chair CreateChair();

        }

 

 

        class FactoryOfWood : Factory //木质品工厂,继承抽象工厂

        {

            public override Desk CreateDesk()

            {

                Console.Write("生产:");

                return new WoodDesk();

            }

 

            public override Chair CreateChair()

            {

                Console.Write("生产:");

                return new WoodChair();

            }

        }

 

        class FactoryOfIron : Factory  //铁制品工厂类,继承抽象工厂

        {

            public override Desk CreateDesk()

            {

                Console.Write("生产:");

                return new IronDesk();

            }

 

            public override Chair CreateChair()

            {

                Console.Write("生产:");

                return new IronChair();

            }

        }

 

        class FactoryOfVine : Factory //藤条制品工厂,继承抽象工厂

        {

            public override Desk CreateDesk()

            {

                Console.Write("生产:");

                return new VineDesk();

            }

 

            public override Chair CreateChair()

            {

                Console.Write("生产:");

                return new VineChair();

            }

        }

 

        static void Main(string[] args)

        {

            Desk desk;

            Chair chair;

            Factory factory = new FactoryOfWood(); //实例化木制品工厂

            desk = factory.CreateDesk();

            desk.produce();

            chair = factory.CreateChair();

            chair.produce();

 

            factory = new FactoryOfIron(); //实例化铁制品工厂

            desk = factory.CreateDesk();

            desk.produce();

            chair = factory.CreateChair();

            chair.produce();

 

            factory = new FactoryOfVine(); //实例化藤条制品工厂

            desk = factory.CreateDesk();

            desk.produce();

            chair = factory.CreateChair();

            chair.produce();

        }

 

5.抽象阶段

思路描述:隔离了具体类的生成,通过实现公共接口来实现实例。

 

类结构图:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!