Правильно ли реализован абстрактный шаблон фабрики для данного сценария ....? - PullRequest
0 голосов
/ 01 июня 2010

Во-первых ... Я новичок в мире шаблонов, так что поправьте меня, если где-то не так Сценарий: Есть несколько компаний, предлагающих несколько продуктов разного размера

, таким образом, есть 3 юридические лица, то есть Компании, Их Продукт и размер продукта

Я реализовал Abstract Pattern на этом, то есть, чтобы я создал экземпляр Интерфейс IProductFactory для получения желаемого продукта ...

Ниже приведена правильная реализация шаблона абстрактной фабрики ??? Если нет, пожалуйста, исправьте подход + Также скажите мне, если какой-либо другой шаблон может быть использован для такого сценария Заранее спасибо ...

public enum Companies
{
    Samsung = 0,
    LG = 1,
    Philips = 2,
    Sony = 3
}

public enum Product
{
    PlasmaTv = 0,
    DVD = 1
}

public enum ProductSize
{
    FortyTwoInch,
    FiftyFiveInch
}

interface IProductFactory
{
    IPhilips GetPhilipsProduct();
    ISony GetSonyProduct();
}

interface ISony
{
    string CreateProducts(Product product, ProductSize size);
}
interface IPhilips
{
    string CreateProducts(Product product, ProductSize size);
}

class ProductFactory : IProductFactory
{
    public IPhilips GetPhilipsProduct()
    {
        return new Philips(); 
    }

    public ISony GetSonyProduct()
    {
        return new Sony();
    }
}

class Philips : IPhilips
{
    #region IPhilips Members

    public string CreateProducts(Product product, ProductSize size)
    {// I have ingnore size for now....
        string output = string.Empty;
        if (product == Product.PlasmaTv)
        {
            output = "Plasma TV Created !!!";
        }
        else if (product == Product.DVD)
        {

            output = "DVD Created !!!";
        }
        return output;
    }

    #endregion
}

class Sony : ISony
{// I have ingnore size for now....
    #region ISony Members
    public string CreateProducts(Product product, ProductSize size)
    {
        string output = string.Empty;
        if (product == Product.PlasmaTv)
        {
            output = "Plasma TV Created !!!";
        }
        else if (product == Product.DVD)
        {

            output = "DVD Created !!!";
        }
        return output;
    }
    #endregion
}



IProductFactory prodFactory = new ProductFactory();
IPhilips philipsObj = prodFactory.GetPhilipsProduct();
MessageBox.Show(philipsObj.CreateProducts(Product.DVD, ProductSize.FortyTwoInch));

or

//ISony sonyObj = prodFactory.GetSonyProduct();
//MessageBox.Show(sonyObj.CreateProducts(Product.DVD, ProductSize.FortyTwoInch));

1 Ответ

5 голосов
/ 01 июня 2010

Нет, скорее должно выглядеть так:

interface IProductFactory
{
    string CreateProducts(Product product, ProductSize size);
}

class SonyProductFactory : IProductFactory
{
    string CreateProducts(Product product, ProductSize size) { ... }
}
class PhilipsProductFactory : IProductFactory
{
    string CreateProducts(Product product, ProductSize size) { ... }
}

...
IProductFactory prodFactory = loadProductFactory();
MessageBox.Show(prodFactory.CreateProducts(Product.DVD, ProductSize.FortyTwoInch));

loadProductFactory() возвращает фабрику Sony или Philips, возможно, в зависимости от конфигурации или состояния приложения. Эту функциональность также можно перенести в отдельный класс загрузчика фабрики, чтобы сделать его более пригодным для повторного использования.

Обновление : Тривиальная реализация может быть

IProductFactory loadProductFactory() {
    String factoryName = System.getProperty("factory.name");
    if (factoryName.equals("Sony") {
        return new SonyProductFactory();
    } else {
        return new PhilipsProductFactory();
    }
}

Более надежная версия может загрузить конкретное имя класса фабрики продукта из файла конфигурации, загрузить класс, убедиться, что это IProductFactory, а затем вернуть его экземпляр. Преимущество этого заключается в том, что больше нет никаких зависимостей ни от какого конкретного класса фабрики продукта, поэтому добавление / изменение / удаление реализаций фабрики не требует перекомпиляции исходных кодов, только изменение файла конфигурации.

...