前言
本篇通过对工厂模式的应用和与简单工厂模式的区别,讲讲我对工厂模式的理解,如果有描述有误或者误人子弟内容,望在评论区指出。
工厂模式的应用场景
当业务场景符合不同条件下创建不同的实例的时候就可以使用工厂模式,但也是创建实例的过程比较复杂,不只是单单new就完事的业务才能使用,不然没有必要使用工厂模式,因为使用工厂模式必然会使系统复杂化。
- 生产主板的时候,有厂商之分,微星、华硕、七彩虹等等都可以生产主板,我们需要根据不同厂商生产对应的主板
- 进行数据库操作的时候,有mysql、sql server、oracle数据库,每个在程序代码里使用方式是不同的,需要根据条件(例如配置文件指定使用哪种数据库)创建对应的实例
工厂模式例子
我们使用上面第一个例子,主板进行代码编写。
要生成的类
MainBoard(主板类)
/**
* 主板
*/
public class MainBoard {
/**
* 主板介绍
*/
public void showConfiguration() {
System.out.println("这个是主板");
}
}
七彩虹主板
/**
* 七彩虹主板
*/
public class ColorfulMainBoard extends MainBoard{
@Override
public void showConfiguration() {
System.out.println("七彩虹 战斧C.AB350M-HD 魔音版 V14B ");
System.out.println("芯片组或北桥芯片:AMD B350 电源接口:LGA1150电源接口");
}
}
微星主板
/**
* 微星主板
*/
public class MsiMainBoard extends MainBoard {
@Override
public void showConfiguration() {
System.out.println("微星B350M主板");
System.out.println("芯片组或北桥芯片:AMD B350 CPU插槽:AM4 支持CPU类型:支持Ryzen 7/5系列处");
}
}
工厂类
主板制作工厂
/**
* 主板制作厂商
*/
public interface MainBoardFactory {
/**
* 上次主板
* @return
*/
MainBoard createMainBoard();
}
七彩虹主板制作工厂
/***
* 七彩虹主板生产
*/
public class ColorfulMainBoardFactoryImpl implements MainBoardFactory {
/**
* 生产主板
* @return
*/
@Override
public MainBoard createMainBoard() {
//进行复杂的创建过程
// .....
return new ColorfulMainBoard();
}
}
微星主板制作工厂
/**
* 微星主板生产工厂
*/
public class MsiMainBoardFactoryImpl implements MainBoardFactory {
/**
* 创建主板
* @return
*/
@Override
public MainBoard createMainBoard() {
//进行复杂的创建过程
// .....
return new MsiMainBoard();
}
}
客户端代码
private static void Factory() {
//客户端工厂模式的使用
String mainBoard="微星";
MainBoardFactory mainBoardFactory=null;
if(mainBoard.equals("七彩虹")){
mainBoardFactory=new ColorfulMainBoardFactoryImpl();
}
else if (mainBoard.equals("微星")){
mainBoardFactory=new MsiMainBoardFactoryImpl();;
}
//输出主板信息
mainBoardFactory.createMainBoard().showConfiguration();
}
这样做会有什么好处呢? 这个等下面理清和简单工厂的区别的时候,就知道了
和简单工厂的区别
工厂模式和简单工厂区别在于 简单工厂是由统一的工厂类生成不同类,而工厂模式将工厂类也抽象化,不再由统一的工厂类生成,而是由具体的工厂进行生成,拿上面主板的例子的话就是,简单工厂模式会使用一个工厂类完成七彩虹、微星主板的创建,而工厂模式则每个主板都有一个工厂完成创建。
简单工厂的处理
/**
* 主板工厂类(简单工厂类使用一个工厂创建不同主板)
*/
public class MainBoardFactory {
/**
* 生产主板
* @return
*/
public static MainBoard createMainBoard(MainBoardType mainBoardType){
MainBoard result=null;
switch (mainBoardType){
case COLORFUL:
result=new ColorfulMainBoard();
break;
case MSI:
result=new MsiMainBoard();
break;
}
return result;
}
}
//客户端代码
private static void SimpleFactory() {
MainBoard mainBoard=simpleFactory.MainBoardFactory.createMainBoard(MainBoardType.MSI);
mainBoard.showConfiguration();
}
这样做有什么意义
当我们新增另一个厂商的主板类的时候,例如新增华硕的主板,看看简单工厂和工厂模式是怎么处理的
-
简单工厂需要先新增华硕的主板类,然后在主板工厂修改代码,加多一个case选择
-
工厂模式需要新增华硕的主板类,然后再新增华硕主板工厂类
显然简单工厂违背了开放-封闭原则,新增功能的时候,修改了原有的类(工厂类),而工厂模式因为把简单工厂里的swich、case选择的代码移动到了客户端由客户端进行选择具体要用那个工厂类,所以并不用修改工厂类。
总结
工厂模式的好在于封装了对象的创建过程,并遵循了开放-封闭原则,以上是我对工厂模式的理解。