FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式
具体参考抽象工厂(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抽象工厂模式的更多相关文章
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...
- AbstractFactory抽象工厂模式(创建型模式)
1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...
- AbstractFactory(抽象工厂模式)
AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- 工厂模式(Factory)和抽象工厂模式(Abstract Factory)
一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者. ...
- C++设计模式-AbstractFactory抽象工厂模式
AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- 八、AbstractFactory 抽象工厂模式
设计原理: 代码清单: 抽象 Factory : public abstract class Factory { public static Factory getFactory(String cla ...
随机推荐
- 用cglib包来为类产生动态代理类对象
一:在JDK里也有动态代理的类和接口,是Proxy和InvocationHandler,但是Proxy只能为接口产生代理类,借助InvocationHandler的实现类来完成对类对象的代理: 但是在 ...
- [小结]了解innodb锁
原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/5603983.html 背景介绍: innodb的锁分两类:lock和latch. 其中la ...
- js 匿名函数 用法
JS执行顺序为从上到下 先声明存储匿名函数的变量放在JS文件中 <script src="/Scripts/niming.js" type="text/javasc ...
- MySQL导入导出表数据
原文链接:http://blog.163.com/yang_jianli/blog/static/1619900062010111011041228/ 1.这里的导出和mysqldump不同,只是导出 ...
- 常见笔记本进入bios方法
联想 y510p ->F2 ThinkPad E431 -> Fn + F1
- Android: Custom View和include标签的区别
Custom View, 使用的时候是这样的: <com.example.home.alltest.view.MyCustomView android:id="@+id/customV ...
- android:theme
附件:常用的系统提供的 android:theme 样式一览表 01 android:theme="@android:style/Theme.Dialog" 将一个Activity ...
- kafka eagel的使用
sql语句eq: select * from "ke_test_topic" where "partition" in (0,1,2) limit 100 官网 ...
- AngularJS 启动执行过程
一.浏览器下载HTML/CSS/JavaScript等 当你转到一个页面地址后,浏览器先回下载这个HTML,同时,会开启一些辅助线程下载所关联的script标签和link标签里引用的文件. 二.浏览器 ...
- C# 函数式编程及Monads.net库
函数式编程中,一切皆为函数,这个函数一般不是类级别的,其可以保存在变量中,可以当做参数或返回值,是函数级别的抽象和重用,将函数作为可重用的基本模块,就像面向对象中一切皆为对象,把所有事物抽象为类,面向 ...