Разберем шаблон проектирования Абстрактная фабрика, паттерн относится к группе порождающих паттернов и применяется для создания семейств связанных или не связанных между собой групп объектов, конкретные классы которых не известны. Ниже приведен код на C++/C#.
#include <iostream> #include <string> using namespace std; class AbstractProduct { public: virtual string ShowPower()=0; }; class AbstractFactory { public: virtual AbstractProduct* GetProduct()=0; }; class ConcreteProductA: AbstractProduct { public: string ShowPower() { return string("This is Win Power NeHe !!!"); } }; class ConcreteFactoryA : AbstractFactory { public: AbstractProduct* GetProduct() { return (AbstractProduct*) (new ConcreteProductA); } }; class ConcreteProductB :AbstractProduct { public: string ShowPower() { return string("This is Linux Power NeHe!!!"); } }; class ConcreteFactoryB : AbstractFactory { public: AbstractProduct* GetProduct() { return (AbstractProduct*) (new ConcreteProductB); } }; int main() { int choice; AbstractFactory* Factory; AbstractProduct* Product; cout<<"Input what interface u want ??? (input Linux=1/Win=2) \n"; cin>>choice; switch(choice) { case 1: Factory= (AbstractFactory*)&ConcreteFactoryB(); break; case 2: Factory = (AbstractFactory*)&ConcreteFactoryA(); break; } Product = (AbstractProduct*)Factory->GetProduct(); cout<<Product->ShowPower()<<endl; getchar(); getchar(); }
Исходник на C#:
using System; namespace AbstarctFactory { interface AbstractProduct { string ShowPower(); } interface AbstractFactory { AbstractProduct GetProduct(); } class ConcreteFactoryA : AbstractFactory { public AbstractProduct GetProduct() { return new ConcreteProductA(); } } class ConcreteProductA : AbstractProduct { public string ShowPower() { return String.Format("This is Win power NeHe!!!"); } } class ConcreteFactoryB : AbstractFactory { public AbstractProduct GetProduct() { return new ConcreteProductB(); } } class ConcreteProductB : AbstractProduct { public string ShowPower() { return String.Format("This is Linux power Nehe!!!"); } } class Program { static void Main(string[] args) { AbstractFactory Factory; AbstractProduct Product; Console.WriteLine("Input what interface u want ??? (input Linux/Win)"); string choice = Console.ReadLine(); switch (choice) { case "Linux": Factory = new ConcreteFactoryB(); break; case "Win": Factory = new ConcreteFactoryA(); break; default: throw new Exception("WTF!!!"); } Product = Factory.GetProduct(); Console.WriteLine("You choose " + Product.ShowPower()); Console.ReadKey(); } } }
На истину не претендую, но мне кажется что, если метод GetProduct() сделать параметризованным и switch case реализовывать в нем, то код будет нагляднее и логичнее.
Сори что так долго не отвечал был в отпуске. GetProduct это метод переопределяемый в каждой конкретной реализации фабрики и в него определить логику выбора какой продукт создавать нельзя. Если же на этот счет есть свои соображения, то с радостью выслушаю.