Design patterns 对于给定的场景,抽象工厂模式是否正确实现。。。。?
第一件事。。。我是模式世界的新手,所以如果哪里出错,请纠正我 脚本: 有多家公司提供多种不同规模的产品 因此有3个实体,即公司、其产品和产品规模 我已经在此基础上实现了抽象模式,因此我将创建 IPProductFactory接口以获取所需产品 下面抽象工厂模式的实现正确吗???如果没有,请纠正方法 + 还请告诉我是否有其他模式可用于此类场景 先谢谢你Design patterns 对于给定的场景,抽象工厂模式是否正确实现。。。。?,design-patterns,Design Patterns,第一件事。。。我是模式世界的新手,所以如果哪里出错,请纠正我 脚本: 有多家公司提供多种不同规模的产品 因此有3个实体,即公司、其产品和产品规模 我已经在此基础上实现了抽象模式,因此我将创建 IPProductFactory接口以获取所需产品 下面抽象工厂模式的实现正确吗???如果没有,请纠正方法 + 还请告诉我是否有其他模式可用于此类场景 先谢谢你 public enum Companies { Samsung = 0, LG = 1, Philips = 2,
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));
不,它应该是这样的:
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()
返回索尼或飞利浦工厂,可能基于配置或应用程序状态。此功能也可以移动到单独的factory loader类中,以使其更具可重用性
更新:一个微不足道的实现可能是
IProductFactory loadProductFactory() {
String factoryName = System.getProperty("factory.name");
if (factoryName.equals("Sony") {
return new SonyProductFactory();
} else {
return new PhilipsProductFactory();
}
}
更健壮的版本可以从配置文件加载具体的产品工厂类名,加载该类,验证它是否为
IPProductFactory
,然后返回它的实例。这样做的好处是,对任何具体的产品工厂类都没有更多的依赖关系,因此添加/更改/删除工厂实现不需要重新编译源代码,只需更改配置文件即可。不,它应该是这样的:
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()
返回索尼或飞利浦工厂,可能基于配置或应用程序状态。此功能也可以移动到单独的factory loader类中,以使其更具可重用性
更新:一个微不足道的实现可能是
IProductFactory loadProductFactory() {
String factoryName = System.getProperty("factory.name");
if (factoryName.equals("Sony") {
return new SonyProductFactory();
} else {
return new PhilipsProductFactory();
}
}
更健壮的版本可以从配置文件加载具体的产品工厂类名,加载该类,验证它是否为
IPProductFactory
,然后返回它的实例。这样做的好处是,对任何具体的产品工厂类都没有更多的依赖关系,因此添加/更改/删除工厂实现不需要重新编译源代码,只需更改配置文件。。。我不知道如何为loadProductFactory()提供定义。。。。请你提供一些关于这个的想法好吗?老实说。。我不知道如何为loadProductFactory()提供定义。。。。你能提供一些更多的想法吗?