具体参考抽象工厂(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. 预装apk

    一般是在device/rockchip/ LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := LanguageSetLOC ...

  2. JS、JSP、ASP、CGI

      1)JS是在客户端执行的,需要浏览器支持Javascript.JSP是在服务器端执行的,需要服务器上部署支持Servlet的服务器程序.JS代码是能够直接从服务器上download得到,对外是可见 ...

  3. .net升级到4.0之后,出现;System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798

    今天在做从Silverlight页中跳转到aspx页的时候,出现错误: 第一次跳转的时候就出现这个错误,然后在点跳转或者刷新这个错误页面,问题就没有了. 解决方案: 在C:\Program Files ...

  4. what is a resolver

    resolver [rɪ'zɒlvə] 解析器 ViewResolver The ViewResolver provides a mapping between view names and actu ...

  5. 1033 To Fill or Not to Fill

    PAT A 1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other ...

  6. Shell编程-09-Shell中的函数

    目录 基本语法 函数执行 函数示例     函数可以简化程序的代码量,达到更好的代码复用度,因此会让程序变得更加易读.简洁和易修改.其作用就是将需要多次使用的代码整合到一块,使其成为一个整体,然后通过 ...

  7. 【python3+request】python3+requests接口自动化测试框架实例详解教程

    转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...

  8. 修改linux swap空间的swappiness,降低对硬盘的缓存

    linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(acti ...

  9. MySQL5.7的安装配置

    双击进入安装,如下图: 2 点击上图红框“Install MySQL Products”进入安装界面,如下图: 3 根据上图当中第一步骤与第二步骤,进入下图: 4 进入设置界面,如下图: 5 在原来旧 ...

  10. 利用Delphi编程控制摄像头(图)

    你的电脑有没有摄像头?看到别人用QQ玩视屏你会不会去想怎么实现的?这里介绍使用DELPHI使用MS的 AVICAP32.DLL就可轻松的实现对摄像头编程,如果再加上你的网络编程水平,实现一个视屏聊天就 ...