具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍.

1、在FactoryMethod工厂方法模式(创建型模式)的基础上,提出了一个代码上的需求,需要对前面的风格进行抽象,将相同风格的道路和房屋工厂类型进行抽象,这就是抽象工厂,代码如下:

    #region 抽象工厂
///// <summary>
///// 抽象的游戏建造系统
///// </summary>
public class BuildSystem
{
/// <summary>
/// 具体的构建方法,Build方法的逻辑变化较慢(只需要创建2种风格的房屋和道路,总共8个对象),但是风格变化较快,由于需求变化,可能需要创建诸如卡通风格、另类风格等的房屋和道路
/// </summary>
public void Build(AbstractFactory cartoonFactory, AbstractFactory alternativeFactory)
{
House HFirstStyleOne = cartoonFactory.CreateHouse();
Console.WriteLine(HFirstStyleOne.ShowHouseStyle());
House HFirstStyleTwo = cartoonFactory.CreateHouse();
Console.WriteLine(HFirstStyleTwo.ShowHouseStyle());
Road RFirstStyleOne = cartoonFactory.CreateRoad();
Console.WriteLine(RFirstStyleOne.ShowRoadStyle());
Road RFirstStyleTwo = cartoonFactory.CreateRoad();
Console.WriteLine(RFirstStyleTwo.ShowRoadStyle());
House HSecondStyleOne = alternativeFactory.CreateHouse();
Console.WriteLine(HSecondStyleOne.ShowHouseStyle());
House HSecondStyleTwo = alternativeFactory.CreateHouse();
Console.WriteLine(HSecondStyleTwo.ShowHouseStyle());
Road RSecondStyleOne = alternativeFactory.CreateRoad();
Console.WriteLine(RSecondStyleOne.ShowRoadStyle());
Road RSecondTwo = alternativeFactory.CreateRoad();
Console.WriteLine(RSecondTwo.ShowRoadStyle());
}
} #region 抽象
public abstract class House
{
public abstract string ShowHouseStyle();
} public abstract class Road
{
public abstract string ShowRoadStyle();
} #endregion #region 抽象工厂
public abstract class AbstractFactory
{
public abstract House CreateHouse(); public abstract Road CreateRoad();
}
#endregion #region 具体抽象工厂-负责系列对象的创建
public class ModernFactory : AbstractFactory
{
public override House CreateHouse()
{
return new ModernHouse();
} public override Road CreateRoad()
{
return new ModernRoad();
}
} public class ClassicalFactory : AbstractFactory
{
public override House CreateHouse()
{
return new ClassicalHouse();
} public override Road CreateRoad()
{
return new ClassicalRoad();
}
} public class CartoonFactory : AbstractFactory
{
public override House CreateHouse()
{
return new CartoonHouse();
} public override Road CreateRoad()
{
return new CartoonRoad();
}
} public class AlternativeFactory : AbstractFactory
{
public override House CreateHouse()
{
return new AlternativeHouse();
} public override Road CreateRoad()
{
return new AlternativeRoad();
}
}
#endregion #region 具体的实现
public class ModernHouse : House
{
public override string ShowHouseStyle()
{
return "Modern现代化风格房屋";
}
} public class ModernRoad : Road
{
public override string ShowRoadStyle()
{
return "Modern现代化风格道路";
}
} public class ClassicalHouse : House
{
public override string ShowHouseStyle()
{
return "Classical古典化风格房屋";
}
} public class ClassicalRoad : Road
{
public override string ShowRoadStyle()
{
return "Classical古典化风格道路";
}
} public class CartoonHouse : House
{
public override string ShowHouseStyle()
{
return "Cartoon卡通化风格房屋";
}
} public class CartoonRoad : Road
{
public override string ShowRoadStyle()
{
return "Cartoon卡通化风格道路";
}
} public class AlternativeHouse : House
{
public override string ShowHouseStyle()
{
return "Alternative另类化风格房屋";
}
} public class AlternativeRoad : Road
{
public override string ShowRoadStyle()
{
return "Alternative另类化风格道路";
}
}
#endregion #endregion

客户端调用代码如下:

        static void Main(string[] args)
{
#region 抽象工厂
BuildSystem buildSystem = new BuildSystem();
buildSystem.Build(new CartoonFactory(), new AlternativeFactory());
#endregion Console.ReadKey();
}

ok,根据输出可以发现,输出可以发现,抽象工厂也可以很好的解决提出的需求,而且,对工厂模式中的工厂类进行抽象,减少了工厂类.提供了代码的扩展性和可读性的同时,精简了代码,如果想继续减少工厂类,让代码保持前面的优势的同时,精简代码请参考:原型模式(创建型模式)

FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式的更多相关文章

  1. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  2. 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型

    1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...

  3. AbstractFactory抽象工厂模式(创建型模式)

    1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...

  4. AbstractFactory(抽象工厂模式)

    AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...

  5. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  6. 工厂模式(Factory)和抽象工厂模式(Abstract Factory)

    一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.     ...

  7. C++设计模式-AbstractFactory抽象工厂模式

    AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...

  8. 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)

      抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...

  9. 八、AbstractFactory 抽象工厂模式

    设计原理: 代码清单: 抽象 Factory : public abstract class Factory { public static Factory getFactory(String cla ...

随机推荐

  1. SQL常用增删改查

    转 http://www.cnblogs.com/daxueshan/p/6687521.html 1增 1.1[插入单行]insert [into] <表名> (列名) values ( ...

  2. 07-css的继承性和层叠性

    css有两大特性:继承性和层叠性 继承性 面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css就是在设置属性的.不会牵扯到方法的层面 ...

  3. Path类对路径字符串的操作

    在写程序时,不时会用到处理文件路径的问题,例如:取得扩展名.从路径中取出文件名.路径合并.取出或者去年扩展名等.这些功能都可以通过System.IO.Path类提供的方法来实现.这些相关功能用过多次了 ...

  4. android 屏幕旋转 不重新加载oncreate

    当手机设定了使用横屏或者竖屏的时候,还想要使用重力感应,可以设置activity属性 android:screenOrientation="sensor" 但是每次翻转屏幕,都会重 ...

  5. java静态代码块、普通代码

    参考文章:http://www.cnblogs.com/qinpengming/p/5227227.html Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的 ...

  6. Codeforces820A Mister B and Book Reading 2017-06-28 09:38 67人阅读 评论(0) 收藏

    A. Mister B and Book Reading time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. java中JDK环境变量的配置

    JDK的配置在 window中的配置,我的电脑-->属性-->高级系统设置-->高级-->环境变量中配置,具体下图

  8. html,css,jquery,JavaScript

    1.全选 (当点击checkall按钮时,选中所有checkbox用prop全选上)function checkAll() { $(':checkbox').prop('checked', true) ...

  9. Oracle EBS使用adpatch工具打patch过程(hotpatch mode)

    目录(?)[-] 从Metalink下载补丁 上传解压 使用adpatch来打patch完整的日志 检查patch是否打成功 adpatch的日志文件 补充关于Oracle EBS Patch的类型 ...

  10. [FMX]获取控件样式中的指定项目以便进行调节

    [FMX]获取控件样式中的指定项目以便进行调节 2017-03-26 • C++ Builder.Delphi.教程 • 暂无评论 • swish •浏览 650 次 FMX 的样式丰富了我们的设计, ...