实现
# include <iostream>
# include <memory>
class Product { public: virtual ~ Product ( ) { } virtual void Operation ( ) const = 0 ;
} ;
class ConcreteProductA : public Product { public: virtual void Operation ( ) const override { std:: cout << "Product A" << std:: endl; }
} ;
class ConcreteProductB : public Product { public: virtual void Operation ( ) const override { std:: cout << "Product B" << std:: endl; }
} ; enum class ProductType: uint8_t { ProductA = 0 , ProductB = 1
} ;
class Factory { public: Product * CreateProduct ( enum ProductType type) const { switch ( type) { case ProductType:: ProductA: return new ConcreteProductA; case ProductType:: ProductB: return new ConcreteProductB; default : throw std:: invalid_argument ( "Invalid product type" ) ; } }
} ; int main ( int argc, char * * argv)
{ Factory factory; ConcreteProductA * productA = reinterpret_cast< ConcreteProductA* > ( factory. CreateProduct ( ProductType:: ProductA) ) ; productA-> Operation ( ) ; delete productA; ConcreteProductB* productB = reinterpret_cast< ConcreteProductB* > ( factory. CreateProduct ( ProductType:: ProductB) ) ; productB-> Operation ( ) ; delete productB; return 0 ;
}
# include <iostream>
# include <memory>
class Product { public: virtual ~ Product ( ) { } virtual void Operation ( ) const = 0 ;
} ;
class ConcreteProductA : public Product { public: virtual void Operation ( ) const override { std:: cout << "Product A" << std:: endl; }
} ;
class ConcreteProductB : public Product { public: virtual void Operation ( ) const override { std:: cout << "Product B" << std:: endl; }
} ;
class Factory { public: virtual ~ Factory ( ) { } virtual Product * CreateProduct ( ) = 0 ;
} ;
class ProductAFactory: public Factory { public: virtual Product * CreateProduct ( ) override { return new ConcreteProductA ( ) ; }
} ;
class ProductBFactory: public Factory { public: virtual Product * CreateProduct ( ) override { return new ConcreteProductB ( ) ; }
} ; int main ( int argc, char * * argv)
{ Factory * a_factory = new ProductAFactory ( ) ; Factory * b_factory = new ProductBFactory ( ) ; auto a_product = a_factory-> CreateProduct ( ) ; auto b_product = b_factory-> CreateProduct ( ) ; a_product-> Operation ( ) ; b_product-> Operation ( ) ; delete a_product; delete b_product; delete a_factory; delete b_factory; return 0 ;
}