Design patterns 抽象工厂模式
抽象工厂模式的定义: 提供一个接口,用于创建相关或从属对象的族,而无需指定其具体类Design patterns 抽象工厂模式,design-patterns,Design Patterns,抽象工厂模式的定义: 提供一个接口,用于创建相关或从属对象的族,而无需指定其具体类 concreate类在这里意味着什么 有人能解释一下在抽象工厂模式中不指定具体类的情况下创建对象意味着什么吗 我认为这里的模式是基于一组类的。我已经将其用于一组类,这些类通过访问数据库的方式进行关联 因此,我将有一个名为nwindactractFactory的抽象类。这个类将包含两个抽象方法,它们将返回一个IProductRepository和一个iordrepository。您不能直接实现任何东西,但是您的业务
我认为这里的模式是基于一组类的。我已经将其用于一组类,这些类通过访问数据库的方式进行关联 因此,我将有一个名为nwindactractFactory的抽象类。这个类将包含两个抽象方法,它们将返回一个IProductRepository和一个iordrepository。您不能直接实现任何东西,但是您的业务逻辑是针对这个抽象工厂和接口编程的 然后,我将创建IPProductRepository和IOrderRepository的具体实现。可能它们被称为SqlProductRepository和SqlOrderRepository。然后我可以创建一个抽象工厂的具体实现,并将其命名为类似于NWindSqlFactory 也许我会有另一个名为NWindXMLFactory的具体工厂,它能够创建XmlProductRepository和XmlOrderRepository 然后,我可以在运行时决定要使用抽象工厂的哪个实现。可能是NWindSqlFactory或NWindXMLFactory,甚至可能是NWindAccessFactory 我再次认为,当您有一组相关的类,但不想针对它们的具体实现编程时,它是有效的
您可以使用一个配置设置,该设置将使用反射来实例化您想要的实际实现。你只需要一个设置就可以做到这一点。您只需要指定具体工厂——因为一旦您拥有了具体工厂,它就可以获得所有其他实现。如果您熟悉.NET check类。这个类提供了对任何数据库访问的抽象。该类定义了用于创建数据库连接、数据库命令等的工厂方法。所有这些方法都会再次返回一般抽象类型。根据特定的数据库服务器/驱动程序返回连接类或命令类的具体实现取决于工厂的具体实现。例如
SqlClientFactory
返回SqlConnection
,SqlCommand
等,但是OracleClientFactory
创建OracleConnection
,oraclecondromd
,等等。只需实例化工厂,就可以访问所有依赖于提供程序的类。使用工厂模式概念考虑以下简单代码:
#include <iostream>
#include <string>
using namespace std;
// Abstract Base Class
class Shape {
public:
virtual void Draw() = 0;
// Static class to create objects
// Change is required only in this function to create a new object type
static Shape* Create(string type);
};
class Circle : public Shape {
public:
void Draw() { cout << "I am circle" << endl; }
friend class Shape; };
class Square : public Shape {
public:
void Draw() { cout << "I am square" << endl; }
friend class Shape; };
Shape* Shape::Create(string type) {
if ( type == "circle" ) return new Circle();
if ( type == "square" ) return new Square();
return NULL; }
void main() {
// Give me a circle
Shape* obj1 = Shape::Create("circle");
// Give me a square
Shape* obj2 = Shape::Create("square");
obj1->Draw();
obj2->Draw();
}
OUTPUT:
I am circle
I am square
#包括
#包括
使用名称空间std;
//抽象基类
阶级形态{
公众:
虚空绘制()=0;
//创建对象的静态类
//仅此函数中需要更改才能创建新的对象类型
静态形状*创建(字符串类型);
};
班级圈子:公共形态{
公众:
void Draw(){cout当客户端需要创建以某种方式相关的对象时,此模式非常有用。如果需要创建相关或从属对象的族,则可以使用抽象工厂模式。
我们可以在该模式中使用以下类:
AbstractFactory:为创建抽象产品的操作声明接口
ConcreteFactory:实现创建具体产品对象的操作
AbstractProduct:为一类产品对象声明一个接口
Product:定义要由相应的实体创建的产品对象
工厂实现抽象产品接口
客户端:使用AbstractFactory和AbstractProduct类声明的接口
这里是工厂设计模式的实现
interface IWorst
{
string Name();
string Cost();
string Millage();
}
interface IBest
{
string Name();
string Cost();
string Millage();
}
class Splender : IWorst
{
public string Name()
{
return "Splender";
}
public string Cost()
{
return "40000 Rupees";
}
public string Millage()
{
return "70 KM/Lit";
}
}
class platina : IWorst
{
public string Name()
{
return "Platina";
}
public string Cost()
{
return "35000 Rupees";
}
public string Millage()
{
return "90 KM/Lit";
}
}
class Vector : IWorst
{
public string Name()
{
return "Victor Plus";
}
public string Cost()
{
return "38000 Rupees";
}
public string Millage()
{
return "80 KM/Lit";
}
}
class Shine : IWorst
{
public string Name()
{
return "Shine";
}
public string Cost()
{
return "45000 Rupees";
}
public string Millage()
{
return "60 KM/Lit";
}
}
class Karizma : IBest
{
public string Name()
{
return "Karizma ZMR";
}
public string Cost()
{
return "115000 Rupees";
}
public string Millage()
{
return "30 KM/Lit";
}
}
class Plusar : IBest
{
public string Name()
{
return "Plusar 220";
}
public string Cost()
{
return "90000 Rupees";
}
public string Millage()
{
return "35 KM/Lit";
}
}
class Apache : IBest
{
public string Name()
{
return "Apache 200";
}
public string Cost()
{
return "85000 Rupees";
}
public string Millage()
{
return "40 KM/Lit";
}
}
class CBR : IBest
{
public string Name()
{
return "CBR 250";
}
public string Cost()
{
return "125000 Rupees";
}
public string Millage()
{
return "25 KM/Lit";
}
}
interface iBikeFactory
{
IBest GetBest();
IWorst GetWorst();
}
class HeroFactory : iBikeFactory
{
public IBest GetBest()
{
return new Karizma();
}
public IWorst GetWorst()
{
return new Splender();
}
}
class BajajFactory : iBikeFactory
{
public IBest GetBest()
{
return new Plusar();
}
public IWorst GetWorst()
{
return new platina();
}
}
class TVSFactory : iBikeFactory
{
public IBest GetBest()
{
return new Apache();
}
public IWorst GetWorst()
{
return new Vector();
}
}
class HondaFactory : iBikeFactory
{
public IBest GetBest()
{
return new CBR();
}
public IWorst GetWorst()
{
return new Shine();
}
}
enum MANUFACTURERS
{
HERO,
BAJAJ,
TVS,
HONDA
}
class BikeTypeChecker
{
iBikeFactory factory;
MANUFACTURERS manu;
public BikeTypeChecker(MANUFACTURERS m)
{
manu = m;
}
public void CheckProducts()
{
switch (manu)
{
case MANUFACTURERS.HERO:
factory = new HeroFactory();
break;
case MANUFACTURERS.BAJAJ:
factory = new BajajFactory();
break;
case MANUFACTURERS.TVS:
factory = new TVSFactory();
break;
case MANUFACTURERS.HONDA:
factory = new HondaFactory();
break;
}
Console.WriteLine("\n"+manu.ToString() + ":\n\nBest Bike: " +
factory.GetBest().Name() + "\nCost : " + factory.GetBest().Cost() + "\nMillage : " + factory.GetBest().Millage()+ "\n\nWorst Bike: " + factory.GetWorst().Name() + "\nCost : " + factory.GetWorst().Cost() +
"\nMillage : " + factory.GetWorst().Millage());
}
}
class MainApp
{
static void Main(string[] args)
{
BikeTypeChecker checker = new BikeTypeChecker(MANUFACTURERS.HERO);
checker.CheckProducts();
Console.ReadLine();
checker = new BikeTypeChecker(MANUFACTURERS.BAJAJ);
checker.CheckProducts();
Console.ReadLine();
checker = new BikeTypeChecker(MANUFACTURERS.HONDA);
checker.CheckProducts();
Console.ReadLine();
checker = new BikeTypeChecker(MANUFACTURERS.TVS);
checker.CheckProducts();
Console.Read();
}
}
这里有很好的解释:你能说出它的具体含义是什么吗?请考虑给你的答案加上一些解释,而不仅仅是代码。