using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//依赖于抽象
namespace _抽象工厂设计模式
{
// 注意:设计一个程序需要仔细观察变化的轴线在哪里,然后进行进一步封装.
/*1.如果没有应对"多系列对象构建"的需求变化,那就没有必要使用
Abstract Factory模式,这时候使用简单的静态工厂完全可以.
2."系列对象"指的是这些对象之间有相互依赖,或者作用的关系,例如游戏开发
场景中的"道路"与"房屋"的依赖.
3.Abstract Factory模式主要应对与"新系列"的需求变动,其缺点在于难与应对
"新对象"的需求变动,比如下面程序,我现在要添加一种"地道"对象,修改起来
会非常麻烦!所以在设计之前一定要观察,它变化的轴线在哪里,这很重要..
4.Abstract Factory模式经常和Factory Method模式共同组合来应对"对象创建"
的需求变化.
*/
//==================抽象===============================
//道路
public abstract class Road {
//可以写一些抽象方法
public abstract void LeiXing();
}
//房屋
public abstract class Building {
//可以写一些抽象方法
public abstract void LeiXing();
}
//抽象工厂
public abstract class FacilitiesFactory {
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
}
//=======================================================
//=================具体实现==============================
//实现1----------------------------------------
public class XianDaiRoad:Road{
public override void LeiXing()
{
Console.WriteLine("现代街道");
}
}
public class XianDaiBuilding : Building
{
public override void LeiXing()
{
Console.WriteLine("现代房屋");
}
}
//--------------------------------------------------------实现1结尾
//实现2----------------------------------------
public class GuDianRoad : Road
{
public override void LeiXing()
{
Console.WriteLine("古典街道");
}
}
public class GuDianBuilding : Building
{
public override void LeiXing()
{
Console.WriteLine("古典房屋");
}
}
//--------------------------------------------------------实现2结尾
//实现3----------------------------------------
public class ZhanZhengRoad : Road
{
public override void LeiXing()
{
Console.WriteLine("战争街道");
}
}
public class ZhanZhengBuilding : Building
{
public override void LeiXing()
{
Console.WriteLine("战争房屋");
}
}
//--------------------------------------------------------实现3结尾
//具体工厂---------------------------------
public class GongChang: FacilitiesFactory {
public override Road CreateRoad()
{
//修改的时候只需要修改这里就可以了,
//return啥就是啥类型的街道/
return new ZhanZhengRoad();
}
public override Building CreateBuilding()
{
//return啥就是啥类型的房屋
return new ZhanZhengBuilding();
}
}
//-------------------------------------------------------------
//客户类---相对就稳定了,无论前面怎么修改这里都不太会有影响
class GameManager {
FacilitiesFactory facilities;
Road road;
Building building;
public GameManager(FacilitiesFactory _facilities) {
this.facilities = _facilities;
}
//这里根本不需要变动,在编程中这里如果有变动的话会很麻烦
public void BuildGameFacilities() {
road = facilities.CreateRoad();
building = facilities.CreateBuilding();
}
//执行,实例后的方法
public void Run() {
road.LeiXing();
building.LeiXing();
}
}
class Program
{
static void Main(string[] args)
{
GongChang gc = new GongChang();
GameManager g = new GameManager(gc);
g.BuildGameFacilities();
g.Run();
Console.ReadKey();
}
}
}