是否为给定场景正确实现了抽象工厂模式....?

Ami*_*mit 0 design-patterns

第一件事......我是模式世界的新手,所以在任何地方错误都要纠正我情景:有多家公司提供多种差异化产品

所以有3个实体,即公司,他们的产品和产品的大小

我已经实现了抽象模式,这样我就可以创建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));
Run Code Online (Sandbox Code Playgroud)

Pét*_*rök 5

不,它应该看起来像这样:

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));
Run Code Online (Sandbox Code Playgroud)

loadProductFactory()返回索尼或飞利浦工厂,可能基于配置或应用程序状态.此功能也可以移动到单独的工厂加载器类中,以使其更具可重用性.

更新:一个简单的实现可能是

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

更健壮的版本可以从配置文件加载具体的产品工厂类名,加载类,验证它是否为IProductFactory,然后返回它的实例.这样做的好处是不再需要任何具体的产品工厂类,因此添加/更改/删除工厂实现不需要重新编译源,只需更改配置文件.