工厂模式 - 无法创建抽象 class 或接口的实例
Factory pattern - cannot create an instance of the abstract class or interface
为了解释:我有一个代码可以在 Console
上创建一个符号模式(我有 4 个不同的 classes,每个有一个模式)我想创建一个 "Factory" 来决定哪个 class 应该用于该符号模式,但我无法创建此 class.
的对象
//doesn't work --> PrinterFactory is an abstract class
PrinterFactory baumPrinterFactory = new PrinterFactory();
//decides which one to get
Baum b1 = new Nadelbaum() { Kronenhoehe = 10, StammHoehe = 9 };
//Baum b1 = new Laubbaum() { Kronenhoehe = 21 };
//Baum b1 = new Weihnachtsbaum() { Kronenhoehe = 15, StammHoehe = 7 };
//Baum b1 = new Obstbaum() { Kronenhoehe = 32 };
//Prints the Pattern
BaumPrinter baumPrinter = new PrinterFactory();
baumPrinterFactory.GetBaumPrinter();
baumPrinter.Print(b1);
你没有说,但我假设每个其他类型都派生自 PrinterFactory
(例如:public class Nadelbaum : PrinterFactory { ... }
)。
通常你会为此使用 static
工厂方法。
public abstract class PrinterFactory
{
public static PrinterFactory GetInstance(string instanceType) {
switch (instanceType) {
case "Nadelbaum": return new Nadelbaum();
case "Laubbaum": return new Laubbaum();
// etc
}
}
}
那么你可以使用:
var printer = PrinterFactory.GetInstance("Nadelbaum");
和 printer
将被定义为类型 PrinterFactory
但实际上是 Nadelbaum
的实例。
您没有指定如何选择要创建的实例类型,所以我只是展示了字符串示例,但您当然可以根据传递给的任何参数选择您能想到的任何标准来选择类型到工厂方法。
为了解释:我有一个代码可以在 Console
上创建一个符号模式(我有 4 个不同的 classes,每个有一个模式)我想创建一个 "Factory" 来决定哪个 class 应该用于该符号模式,但我无法创建此 class.
//doesn't work --> PrinterFactory is an abstract class
PrinterFactory baumPrinterFactory = new PrinterFactory();
//decides which one to get
Baum b1 = new Nadelbaum() { Kronenhoehe = 10, StammHoehe = 9 };
//Baum b1 = new Laubbaum() { Kronenhoehe = 21 };
//Baum b1 = new Weihnachtsbaum() { Kronenhoehe = 15, StammHoehe = 7 };
//Baum b1 = new Obstbaum() { Kronenhoehe = 32 };
//Prints the Pattern
BaumPrinter baumPrinter = new PrinterFactory();
baumPrinterFactory.GetBaumPrinter();
baumPrinter.Print(b1);
你没有说,但我假设每个其他类型都派生自 PrinterFactory
(例如:public class Nadelbaum : PrinterFactory { ... }
)。
通常你会为此使用 static
工厂方法。
public abstract class PrinterFactory
{
public static PrinterFactory GetInstance(string instanceType) {
switch (instanceType) {
case "Nadelbaum": return new Nadelbaum();
case "Laubbaum": return new Laubbaum();
// etc
}
}
}
那么你可以使用:
var printer = PrinterFactory.GetInstance("Nadelbaum");
和 printer
将被定义为类型 PrinterFactory
但实际上是 Nadelbaum
的实例。
您没有指定如何选择要创建的实例类型,所以我只是展示了字符串示例,但您当然可以根据传递给的任何参数选择您能想到的任何标准来选择类型到工厂方法。