工厂方法模式(Factory Method)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值