Шаблон проектирования Абстрактная фабрика (Abstract Factory)

Август 11th, 2011 § 2 comments

Разберем шаблон проектирования Абстрактная фабрика, паттерн относится к группе порождающих паттернов и применяется для создания семейств связанных или не связанных между собой групп объектов, конкретные классы которых не известны. Ниже приведен код на 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();

 }
 }
}

§ 2 Responses to Шаблон проектирования Абстрактная фабрика (Abstract Factory)"

  • b099ard пишет:

    На истину не претендую, но мне кажется что, если метод GetProduct() сделать параметризованным и switch case реализовывать в нем, то код будет нагляднее и логичнее.

    • admin пишет:

      Сори что так долго не отвечал был в отпуске. GetProduct это метод переопределяемый в каждой конкретной реализации фабрики и в него определить логику выбора какой продукт создавать нельзя. Если же на этот счет есть свои соображения, то с радостью выслушаю.

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн