姓名:赵汉青
学号: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.抽象阶段
思路描述:隔离了具体类的生成,通过实现公共接口来实现实例。
类结构图: