Middle
Kā īstenot abstraktās rūpnīcas modeli?
sobes.tech AI
Atbilde no AI
Abstraktā rūpnīca nodrošina saskarni, lai izveidotu savienotas vai atkarīgas objektu ģimenes, ne norādot to konkrētās klases.
Galvenās sastāvdaļas:
- Abstract Factory: Izsludina saskarni abstraktu produktu izveidošanas operācijām.
- Concrete Factory: Realizē konkrētas ģimenes produktu izveidošanas operācijas.
- Abstract Product: Izsludina saskarni produkta tipam.
- Concrete Product: Realizē Abstract Product saskarni konkrētam produktam.
- Client: Izmanto Abstract Factory un Abstract Product saskarnes, bet nezin par Concrete Factory un Concrete Product.
Īstenošana:
- Definēta abstrakta rūpnīca ar metodēm katra produkta veida izveidei.
- Katrai produktu ģimenei tiek izveidota konkrēta rūpnīca, kas īsteno abstraktās rūpnīcas metodes un izveido atbilstošus konkrētus produktus.
- Katram produkta veidam tiek noteikta abstrakta produkta saskarne.
- Katram konkrētam produktam tiek izveidota klase, kas īsteno atbilstošo produkta saskarni.
- Klienta kods saņem abstraktās rūpnīcas objektu un izsauc tās metodes produktu izveidei, strādājot tikai ar produktu saskarnēm.
// Abstraktā rūpnīca
public interface IAbstractFactory
{
IAbstractProductA CreateProductA();
IAbstractProductB CreateProductB();
}
// Konkrētā rūpnīca 1
public class ConcreteFactory1 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
// Konkrētā rūpnīca 2
public class ConcreteFactory2 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
// Abstrakts produkts A
public interface IAbstractProductA
{
string UsefulFunctionA();
}
// Konkrētais produkts A1
public class ConcreteProductA1 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "The result of the product A1.";
}
}
// Konkrētais produkts A2
public class ConcreteProductA2 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "The result of the product A2.";
}
}
// Abstrakts produkts B
public interface IAbstractProductB
{
string UsefulFunctionB();
string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}
// Konkrētais produkts B1
public class ConcreteProductB1 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "The result of the product B1.";
}
// B1 produkts var strādāt tikai ar A produktiem tā paša varianta
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"The result of the B1 collaborating with the ({result})";
}
}
// Konkrētais produkts B2
public class ConcreteProductB2 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "The result of the product B2.";
}
// B2 produkts var strādāt tikai ar A produktiem tā paša varianta
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"The result of the B2 collaborating with the ({result})";
}
}
// Klienta kods
public class Client
{
public void Main()
{
// Klienta kods strādā ar abstraktu rūpnīcu
Console.WriteLine("Client: Testing client code with the first factory type:");
ClientMethod(new ConcreteFactory1());
Console.WriteLine();
Console.WriteLine("Client: Testing the same client code with the second factory type:");
ClientMethod(new ConcreteFactory2());
}
public void ClientMethod(IAbstractFactory factory)
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productB.UsefulFunctionB());
Console.WriteLine(productB.AnotherUsefulFunctionB(productA));
}
}