|
@@ -0,0 +1,211 @@
|
|
|
+
|
|
|
+
|
|
|
+#include<memory>
|
|
|
+#include<iostream>
|
|
|
+#include<map>
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class basic_factory
|
|
|
+{
|
|
|
+private:
|
|
|
+ int data;
|
|
|
+protected:
|
|
|
+ basic_factory(){}
|
|
|
+public:
|
|
|
+ static std::shared_ptr<basic_factory> create()
|
|
|
+ {
|
|
|
+ return std::shared_ptr<basic_factory>(new basic_factory);
|
|
|
+ }
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class factory;
|
|
|
+class A
|
|
|
+{
|
|
|
+ int data;
|
|
|
+ friend factory;
|
|
|
+protected:
|
|
|
+ A(){}
|
|
|
+};
|
|
|
+
|
|
|
+class B
|
|
|
+{
|
|
|
+ int data;
|
|
|
+ friend factory;
|
|
|
+protected:
|
|
|
+ B(){}
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class factory
|
|
|
+{
|
|
|
+public:
|
|
|
+ static std::shared_ptr<A> create_A()
|
|
|
+ {
|
|
|
+ return std::shared_ptr<A>(new A);
|
|
|
+ }
|
|
|
+ static std::shared_ptr<B> create_B()
|
|
|
+ {
|
|
|
+ return std::shared_ptr<B>(new B);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class base
|
|
|
+{
|
|
|
+public:
|
|
|
+ virtual void print()
|
|
|
+ {
|
|
|
+ std::cout<<"basic"<<std::endl;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+class base_A:public base
|
|
|
+{
|
|
|
+public:
|
|
|
+ void print()override
|
|
|
+ {
|
|
|
+ std::cout<<"A"<<std::endl;
|
|
|
+ }
|
|
|
+};
|
|
|
+class base_B:public base
|
|
|
+{
|
|
|
+public:
|
|
|
+ void print()override
|
|
|
+ {
|
|
|
+ std::cout<<"B"<<std::endl;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+class factory_V
|
|
|
+{
|
|
|
+public:
|
|
|
+
|
|
|
+ static std::shared_ptr<base> create(int type)
|
|
|
+ {
|
|
|
+ switch(type)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ {
|
|
|
+ return std::shared_ptr<base>(new base);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 2:
|
|
|
+ {
|
|
|
+ return std::shared_ptr<base>(new base_A);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 3:
|
|
|
+ {
|
|
|
+ return std::shared_ptr<base>(new base_B);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ return std::shared_ptr<base>(new base);
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class insert
|
|
|
+{
|
|
|
+ int data;
|
|
|
+ class factory
|
|
|
+ {
|
|
|
+ protected:
|
|
|
+ factory()=default;
|
|
|
+ public:
|
|
|
+ std::shared_ptr<insert> create()
|
|
|
+ {
|
|
|
+ return std::move(std::shared_ptr<insert>(new insert));
|
|
|
+ }
|
|
|
+ };
|
|
|
+public:
|
|
|
+ static factory lab;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class prepare_coffee;
|
|
|
+class prepare_water;
|
|
|
+struct drink
|
|
|
+{
|
|
|
+
|
|
|
+};
|
|
|
+struct coffee:public drink
|
|
|
+{
|
|
|
+ int c;
|
|
|
+private:
|
|
|
+ coffee()=default;
|
|
|
+ friend prepare_coffee;
|
|
|
+};
|
|
|
+struct water:public drink
|
|
|
+{
|
|
|
+ int c;
|
|
|
+private:
|
|
|
+ water()=default;
|
|
|
+ friend prepare_water;
|
|
|
+};
|
|
|
+
|
|
|
+class abstract
|
|
|
+{
|
|
|
+public:
|
|
|
+ virtual std::shared_ptr<drink> prepare()=0;
|
|
|
+};
|
|
|
+
|
|
|
+class prepare_water:public abstract
|
|
|
+{
|
|
|
+public:
|
|
|
+ std::shared_ptr<drink> prepare()override
|
|
|
+ {
|
|
|
+ return std::move(std::shared_ptr<drink>(new water));
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+class prepare_coffee:public abstract
|
|
|
+{
|
|
|
+public:
|
|
|
+ std::shared_ptr<drink> prepare()override
|
|
|
+ {
|
|
|
+ return std::move(std::shared_ptr<drink>(new coffee));
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class prepare_drink
|
|
|
+{
|
|
|
+private:
|
|
|
+ std::map<std::string,std::shared_ptr<abstract>> prepare_drinks;
|
|
|
+public:
|
|
|
+ prepare_drink()
|
|
|
+ {
|
|
|
+ prepare_drinks["coffee"]=std::make_shared<prepare_coffee>();
|
|
|
+ prepare_drinks["water"]=std::make_shared<prepare_water>();
|
|
|
+ }
|
|
|
+ std::shared_ptr<drink> prepare(const std::string& name)
|
|
|
+ {
|
|
|
+ std::shared_ptr<drink> result=prepare_drinks[name]->prepare();
|
|
|
+ return std::move(result);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+int main()
|
|
|
+{
|
|
|
+ basic_factory::create();
|
|
|
+
|
|
|
+ factory_V::create(1)->print();
|
|
|
+ factory_V::create(2)->print();
|
|
|
+ factory_V::create(3)->print();
|
|
|
+
|
|
|
+ insert::lab.create();
|
|
|
+}
|