工厂方法模式(Factory Method)

来源:互联网 发布:js 修改对象属性值 编辑:程序博客网 时间:2024/06/05 16:08

factory method 提供了一种延迟创建类的方式,使用这个方式可以在运行期由子类判断创建哪一个类的实例。其次,创建一个对象似乎是一个最简单的是object=new ClassName(),但面对大型软件或不同运行环境时就存在问题:
1、简单的创建方式造成硬编码,在不同的运行环境中就需要复杂的逻辑实例化不同的实例。
2、为了使用于不同的运行环境,通常我们需要定义抽象的接口,在不同的环境中实现不同的子类实例
效果:
根据不同的配置及上下文环境加载具有相同抽象类的不同实现实例,实现可配置,动态的创建

#include <iostream>using namespace std;namespace Occ{/** * 职业 */ class Occupation {public:    virtual void learn()=0;    virtual void write()=0;    virtual void read()=0;};class Student: public Occupation {public:    void learn() {        cout << "学生学习..." << endl;    }    void write() {        cout << "学生写作..." << endl;    }    void read() {        cout << "学生读文章..." << endl;    }};class Teacher: public Occupation {public:    void learn() {            cout << "老师学习..." << endl;        }        void write() {            cout << "老师写作..." << endl;        }        void read() {            cout << "老师读文章..." << endl;        }};}namespace IFac{class IFactory {public:    virtual Occ::Occupation *createOccupation()=0;};class StudentFactory: public IFactory {    Occ::Occupation *createOccupation(){       return new Occ::Student();    }};class TeacherFactory: public IFactory {    Occ::Occupation *createOccupation(){        return new Occ::Teacher();    }};}int main() {   //需要创建学生时    IFac::IFactory * ifctory =new IFac::StudentFactory();    Occ::Occupation * occupation=ifctory->createOccupation();    occupation->learn();    occupation->write();    occupation->read();   //需要创建老师时    IFac::IFactory * ifctory1 =new IFac::TeacherFactory();    Occ::Occupation * occupation1=ifctory1->createOccupation();    occupation1->learn();    occupation1->write();    occupation1->read();    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!    return 0;}

Spring 通过工厂方法来配置bean

  bean.xml      <bean id="ifctory " class="com.dpicadev.factoryMethod.IFactory ">            ......      </bean>      <bean id="occupation" factory-bean="ifctory" factory-method="createOccupation">         .....              </bean>      <bean id="occupation1" factory-bean="ifctory" factory-method="createOccupation">         .....              </bean>  java:      ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");      Occupation occupation= (Occupation ) ctx.getBean("occupation");      System.out.println(occupation->learn());       Occupation occupation1= (Occupation ) ctx.getBean("occupation1");      System.out.println(occupation1->learn());
0 0