1、面向接口编程:最简单的表现形式是,你的变量要声明成抽象基类;
2、为什么要实现面向接口编程:设计原则:依赖倒置原则——应该依赖抽象而不是细节。
3、抽象基类是不能创建的,不能new的。
4、创建对象的方法:除了在栈上、或者是在堆上创建对象,也可以通过方法返回对象。
5、虚函数:运行时的依赖
模式定义:定义一个用于创建对象的接口(工厂基类);让子类(子类工厂)决定实例化哪一个类(具体类);
目的:解耦,手段是虚函数
要点总结:
Factory Method用于隔离类对象的使用这和具体类之间的耦合关系。而对于一个经常变化具体类型,耦合关系会导致软件的脆弱;
Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展的策略,较好的解决这种紧耦合关系。
Factory Method模式解决“单个对象”的需求华变化。缺点在与要求创建方法相同
具体类图关系
具体实现如下:
Product实现:
spliter.h
#pragma once
#include<iostream>
using namespace std;
//产品Product基类
class ISpliter
{
public:
virtual void split() = 0;
};
//具体产品
//产品一:二进制切割器
class BinarySpliter :public ISpliter
{
public:
void split()
{
cout << "BinarySpliter Split" << endl;
}
};
//产品二:视频切割器
class VedioSpliter :public ISpliter
{
public:
void split()
{
cout << "VedioSpliter Split" << endl;
}
};
//产品三:文件切割器
class FileSpliter :public ISpliter
{
public:
void split()
{
cout << "FileSpliter Split" << endl;
}
};
Creator实现:
factory.h
#pragma once
#include"ISpliter.h"
//创造器Creator基类接口
class SpliterFactory
{
public:
virtual ISpliter* CreateSpliter() = 0;
};
//具体的创建器工厂
//工厂一:二进制切割器创造工厂
class BinarySpliterFactory :public SpliterFactory
{
public:
ISpliter* CreateSpliter()
{
return new BinarySpliter();
}
};
//工厂二:视频切割器创造工厂
class VedioSpliterFactory :public SpliterFactory
{
public:
ISpliter* CreateSpliter()
{
return new VedioSpliter();
}
};
//工厂三:文件切割器创造工厂
class FileSpliterFactory :public SpliterFactory
{
public:
ISpliter* CreateSpliter()
{
return new FileSpliter();
}
};
使用者实现:
#pragma once
//对象的使用者
#include"SpliterFactory.h"
class MainForm
{
public:
MainForm(SpliterFactory* factory)
{
this->factory = factory;
}
public:
ISpliter* Button1_Click() {
return factory->CreateSpliter();
}
private:
SpliterFactory* factory;
};
测试:
#include"MainForm.h"
int main()
{
SpliterFactory* bf = new VedioSpliterFactory();
MainForm mainform(bf);
ISpliter* spliter = mainform.Button1_Click();
spliter->split();
return 0;
}