/*抽象工厂*/
#include <string>
#include <memory>
class Car {//抽象工厂
public:
Car(string& name)
:_name(name)
{}
virtual void show() = 0;
protected:
string _name;
};
class Bwm :public Car {
public:
Bwm(string name)
:Car(name)
{}
void show() { cout << "获得一辆宝马:" << _name << endl; }
};
class Audi :public Car {
public:
Audi(string name)
:Car(name)
{}
void show() { cout << "获得一辆奥迪:" << _name << endl; }
};
class Light {
public:
virtual void show() = 0;
};
class BwmLight :public Light {
public:
void show() {
cout << "宝马灯" << endl;
}
};
class AudiLight :public Light {
public:
void show() {
cout << "奥迪车灯" << endl;
}
};
class AbstractFactory {
public:
virtual Car* createCar(string name) = 0;
virtual Light* createLight() = 0;
};
class BwmFactory :public AbstractFactory {
public:
Car* createCar(string name) {
return new Bwm(name);
}
Light* createLight() {
return new BwmLight();
}
};
class AudiFactory :public AbstractFactory {
public:
Car* createCar(string name) {
return new Audi(name);
}
Light* createLight() {
return new AudiLight();
}
};
int main() {
unique_ptr<AbstractFactory> bwmfty(new BwmFactory());
unique_ptr<AbstractFactory> audifty(new AudiFactory());
unique_ptr<Car> p1(bwmfty->createCar("x3"));
unique_ptr<Car> p2(audifty->createCar("A9"));
unique_ptr<Light> p3((bwmfty->createLight()));
unique_ptr<Light> p4((audifty->createLight()));
p1->show();
p2->show();
p3->show();
p4->show();
return 0;
}
/*代理模式*/
class VideoSite {//抽象类
public:
virtual void freeMovie() = 0;
virtual void vipMovie() = 0;
virtual void ticketMovie() = 0;
};
class FixBugVideoSite :public VideoSite {//委托类
public:
virtual void freeMovie() {
cout << "观看免费电影" << endl;
}
virtual void vipMovie() {
cout << "观看VIP电影" << endl;
}
virtual void ticketMovie() {
cout << "用券观看电影" << endl;
}
};
class FreeVideoSiteProxy :public VideoSite {//代理类
public:
FreeVideoSiteProxy() { pVideo = new FixBugVideoSite(); }
~FreeVideoSiteProxy() { delete[]pVideo; }
virtual void freeMovie() {
pVideo->freeMovie();
}
virtual void vipMovie() {
cout << "属于游客状态,无法观看vip电影,请升级成VIP后再观看" << endl;
}
virtual void ticketMovie() {
cout << "属于游客状态,没有买券无法观看电影" << endl;
}
private:
FixBugVideoSite* pVideo;
};
class VipVideoSiteProxy :public VideoSite {
public:
virtual void freeMovie() {
video.freeMovie();
}
virtual void vipMovie() {
video.vipMovie();
}
virtual void ticketMovie() {
cout << "属于游客状态,没有买券无法观看电影" << endl;
}
private:
FixBugVideoSite video;
};
class TicketVideoSiteProxy :public VideoSite {
public:
virtual void freeMovie() {
video.freeMovie();
}
virtual void vipMovie() {
video.vipMovie();
}
virtual void ticketMovie() {
video.ticketMovie();
}
private:
FixBugVideoSite video;
};
void watchMovie(unique_ptr<VideoSite>& ptr) {
ptr->freeMovie();
ptr->vipMovie();
ptr->ticketMovie();
}
int main() {
/*unique_ptr<VideoSite> p(new FixBugVideoSite());
p->freeMovie();
p->vipMovie();
p->ticketMovie();*/
unique_ptr<VideoSite> p1(new FreeVideoSiteProxy());
unique_ptr<VideoSite> p2(new VipVideoSiteProxy());
unique_ptr<VideoSite> p3(new TicketVideoSiteProxy());
watchMovie(p1);
watchMovie(p2);
watchMovie(p3);
return 0;
}