Skip to content

Instantly share code, notes, and snippets.

@sevperez
Created October 17, 2018 17:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sevperez/9777e5ae382489283d08e957d450d87e to your computer and use it in GitHub Desktop.
Save sevperez/9777e5ae382489283d08e957d450d87e to your computer and use it in GitHub Desktop.
using System;
namespace abs_fac_1
{
class Program
{
static void Main(string[] args)
{
MonumentHandler greekMonumentHandler =
new MonumentHandler(new GreekMonumentFactory(), "Athena", "Pericles");
greekMonumentHandler.IssueMessages();
// The Olympian deity Athena demands tribute!
// The noble Greek leader Pericles requests submission of taxes!
MonumentHandler egyptianMonumentHandler =
new MonumentHandler(new EgyptianMonumentFactory(), "Sekhmet", "Hatchepsut");
egyptianMonumentHandler.IssueMessages();
// Now accepting offerings to the Egyptian deity Sekhmet!
// The mighty Egyptian pharaoh Hatchepsut demands payment of taxes!
}
}
class MonumentHandler
{
private IAbstractMonumentFactory Factory;
private ITemple Temple;
private IPalace Palace;
public MonumentHandler(IAbstractMonumentFactory factory, string deityName, string leaderName)
{
this.Factory = factory;
this.Temple = factory.BuildTemple(deityName);
this.Palace = factory.BuildPalace(leaderName);
}
public void IssueMessages()
{
this.Temple.CollectOfferings();
this.Palace.CollectTaxes();
}
}
interface IAbstractMonumentFactory
{
ITemple BuildTemple(string deityName);
IPalace BuildPalace(string leaderName);
}
class GreekMonumentFactory : IAbstractMonumentFactory
{
public ITemple BuildTemple(string deityName) => new GreekTemple(deityName);
public IPalace BuildPalace(string leaderName) => new GreekPalace(leaderName);
}
class EgyptianMonumentFactory : IAbstractMonumentFactory
{
public ITemple BuildTemple(string deityName) => new EgyptianTemple(deityName);
public IPalace BuildPalace(string leaderName) => new EgyptianPalace(leaderName);
}
interface ITemple
{
void CollectOfferings();
}
class GreekTemple : ITemple
{
private string Deity;
public GreekTemple(string deityName) => this.Deity = deityName;
public void CollectOfferings() =>
Console.WriteLine($"The Olympian deity {this.Deity} demands tribute!");
}
class EgyptianTemple : ITemple
{
private string Deity;
public EgyptianTemple(string deityName) => this.Deity = deityName;
public void CollectOfferings() =>
Console.WriteLine($"Now accepting offerings to the Egyptian deity {this.Deity}!");
}
interface IPalace
{
void CollectTaxes();
}
class GreekPalace : IPalace
{
private string Leader;
public GreekPalace(string leaderName) => this.Leader = leaderName;
public void CollectTaxes() =>
Console.WriteLine($"The noble Greek leader {this.Leader} requests submission of taxes!");
}
class EgyptianPalace : IPalace
{
private string Leader;
public EgyptianPalace(string leaderName) => this.Leader = leaderName;
public void CollectTaxes() =>
Console.WriteLine($"The mighty Egyptian pharaoh {this.Leader} demands payment of taxes!");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment