设计模式:工厂内的建造者
Design Patterns: Builder within a Factory
我想知道这是否是一种有效的设计模式实践。我目前正在设计一个代码,其中工厂内似乎有一个构建器。我可以闻到我当前设计中的一些不好的东西,但我无法确定它。代码看起来像这样...
class Program
{
static void Main()
{
string productName = "productA";
IProduct product1 = new Factory().GetNewProduct(productName);
}
}
class Factory
{
internal IProduct GetNewProduct(string name)
{
IProduct product = null;
switch (name)
{
case "productA":
product = new ProductA();
break;
case "productB":
product = new ProductB();
break;
case "productC":
product = new ProductC();
break;
default:
throw new Exception("Invalid product type!");
}
//builder (sort of)
product.addPart1();
product.addPart2();
...
return product;
}
}
你的方法的问题是没有任何灵活性
在构建 IProduct 对象时,所有对象都以相同的方式构建,因此如果明天需要以其他方式创建某个对象。您将不得不进行重大更改。我建议的是在 Builder class 中有一个 Factory 方法,如下所示
class Builder {
IProduct product;
public Builder(String type) {
product = new Factory().getNewProduct(type);
}
public Builder addPart1() {
product.addPart1();
return this;
}
public Builder addPart2() {
product.addPart2();
return this;
}
public void build() {
return product;
}
private class Factory {
IProduct GetNewProduct(string name) {
IProduct product = null;
switch (name)
{
case "productA":
product = new ProductA();
break;
case "productB":
product = new ProductB();
break;
case "productC":
product = new ProductC();
break;
default:
throw new Exception("Invalid product type!");
}
return product;
}
}
}
class Program {
static void Main()
{
String productName = "productA";
IProduct product1 = new Builder(productName)
.addPart1()
.addPart2()
.build();
}
}
在这种方法中,您可以独立添加更多产品类型(在您的工厂方法中)并使用更多部分逐步构建您的对象:)
我想知道这是否是一种有效的设计模式实践。我目前正在设计一个代码,其中工厂内似乎有一个构建器。我可以闻到我当前设计中的一些不好的东西,但我无法确定它。代码看起来像这样...
class Program
{
static void Main()
{
string productName = "productA";
IProduct product1 = new Factory().GetNewProduct(productName);
}
}
class Factory
{
internal IProduct GetNewProduct(string name)
{
IProduct product = null;
switch (name)
{
case "productA":
product = new ProductA();
break;
case "productB":
product = new ProductB();
break;
case "productC":
product = new ProductC();
break;
default:
throw new Exception("Invalid product type!");
}
//builder (sort of)
product.addPart1();
product.addPart2();
...
return product;
}
}
你的方法的问题是没有任何灵活性 在构建 IProduct 对象时,所有对象都以相同的方式构建,因此如果明天需要以其他方式创建某个对象。您将不得不进行重大更改。我建议的是在 Builder class 中有一个 Factory 方法,如下所示
class Builder {
IProduct product;
public Builder(String type) {
product = new Factory().getNewProduct(type);
}
public Builder addPart1() {
product.addPart1();
return this;
}
public Builder addPart2() {
product.addPart2();
return this;
}
public void build() {
return product;
}
private class Factory {
IProduct GetNewProduct(string name) {
IProduct product = null;
switch (name)
{
case "productA":
product = new ProductA();
break;
case "productB":
product = new ProductB();
break;
case "productC":
product = new ProductC();
break;
default:
throw new Exception("Invalid product type!");
}
return product;
}
}
}
class Program {
static void Main()
{
String productName = "productA";
IProduct product1 = new Builder(productName)
.addPart1()
.addPart2()
.build();
}
}
在这种方法中,您可以独立添加更多产品类型(在您的工厂方法中)并使用更多部分逐步构建您的对象:)