工厂模式主要用于有很多类时,主要封装了对象的创建。
简单工厂 :把对象的创建封装在一个接口函数中,通过传入标识,返回创建的对象,不用了解对象创建的过程
一个工厂不能生产很多种类的汽车,不符合开闭原则。
class car
{
public:
car(string name) :_name(name){}
virtual void show() = 0;
protected:
string _name;
};
class BMW :public car
{
public:
BMW(string name) :car(name){}
void show()
{
cout << "BMW" << _name << endl;
}
};
class AUDI :public car
{
public:
AUDI(string name) :car(name) {}
void show()
{
cout << "AUDI" << _name << endl;
}
};
enum carType {
audi,bmw
};
class simplyfactory
{
public:
car* createcar(carType ct)
{
switch (ct)
{
case bmw:
return new BMW("x5");
case audi:
return new AUDI("a8");
default:
cout << "errror" << endl;
break;
}
return nullptr;
}
};
int main()
{
simplyfactory * fac = new simplyfactory();
car* p1 = fac->createcar(bmw);
car* p2 = fac->createcar(audi);
p1->show();
p2->show();
return 0;
}
工厂方法:提供一个纯虚函数创建产品,派生类负责创建对应的产品。
设置一个管理者,让具体的工厂生产具体的产品。
简单工厂的不足之处是比如生产小米,不可能创建好几个工厂管理者去分别生产手机。电视。洗衣机等。
class car
{
public:
car(string name) :_name(name){}
virtual void show() = 0;
protected:
string _name;
};
class BMW :public car
{
public:
BMW(string name) :car(name){}
void show()
{
cout << "BMW" << _name << endl;
}
};
class AUDI :public car
{
public:
AUDI(string name) :car(name) {}
void show()
{
cout << "AUDI" << _name << endl;
}
};
enum carType {
audi,bmw
};
class simplyfactory
{
public:
virtual car* createcar(string name) = 0;
};
class bmwfactory :public simplyfactory
{
public:
car* createcar(string name)
{
return new BMW(name);
}
};
int main()
{
unique_ptr<simplyfactory> bmwfac(new bmwfactory());
unique_ptr<car> p1(bmwfac->createcar("fll"));
p1->show();
return 0;
}
抽象工厂
对一组有关联的产品提供对象的统一创建。
class car
{
public:
car(string name) :_name(name){}
virtual void show() = 0;
protected:
string _name;
};
class BMW :public car
{
public:
BMW(string name) :car(name){}
void show()
{
cout << "BMW" << _name << endl;
}
};
class AUDI :public car
{
public:
AUDI(string name) :car(name) {}
void show()
{
cout << "AUDI" << _name << endl;
}
};
class light
{
public:
virtual void show() = 0;
};
class bmwlight:public light
{
public:
void show() { cout << "bmw light" << endl; }
};
class audilight :public light
{
public:
void show() { cout << "audi light" << endl; }
};
enum carType {
audi,bmw
};
class absfactory
{
public:
virtual car* createcar(string name) = 0;
virtual light* createlight() = 0;
};
class bmwfactory :public absfactory
{
public:
car* createcar(string name)
{
return new BMW(name);
}
light* createlight()
{
return new bmwlight();
}
};
int main()
{
unique_ptr<absfactory> bmwfac(new bmwfactory());
unique_ptr<car> p1(bmwfac->createcar("fll"));
unique_ptr<light> p2(bmwfac->createlight());
p1->show();
p2->show();
return 0;
}