123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #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();
- }
|