Фабричный шаблон - не может создать экземпляр абстрактного класса или интерфейса - PullRequest
0 голосов
/ 29 октября 2018

Для объяснения: у меня есть код, который создает шаблон символов (у меня есть 4 различных класса с одним шаблоном каждый) на Console, и я хочу создать «Фабрику», чтобы решить, какой класс он должен использовать для этого шаблона символов, но я не могу создать объект этого класса.

//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);    

1 Ответ

0 голосов
/ 29 октября 2018

Вы не говорите, но я предполагаю, что каждый из других типов происходит от 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.

Вы не указали, как вы выбираете, какой тип экземпляра создавать, поэтому я просто показал и пример со строками, но вы, конечно, можете выбрать любой критерий для выбора типа на основе любых параметров, которые вы передаете в фабричный метод.

...