目录
一、什么是工厂模式?
工厂设计模式,顾名思义,就是用来生产对象的,在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则,如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦。
二、工厂模式的分类
工厂模式主要分为三种:
简单工厂模式
工厂方法模式
抽象工厂模式
接下来我主要先说下简单工厂模式
三、简单工厂模式
定义:
定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)。
优缺点:
优点:
(1)工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责
(2)客户端无需知道所创建具体产品的类名,只需知道参数即可
(3)也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点:
(1)工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
(2)使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
(3)系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
(4)简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。
适用环境及涉及角色
环境:
(1)工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂
(2)客户端只知道传入工厂类的参数,对如何创建对象不关心
角色:
1、抽象产品
2、具体产品
3、具体工厂
4、产品使用者
代码使用
pc接口
public interface Pc {
void lol();
}
具体类 戴尔
public class Dell implements Pc{
@Override
public void lol() {
//戴尔
}
}
具体类 微星
public class Msi implements Pc {
@Override
public void lol() {
//微星
}
}
具体工厂 电脑工厂
public class Computer {
public Pc createPc(String type) {
if (type.equals("微星")) {//购买微星
return new Msi();
} else if (type.equals("戴尔")) {//购买戴尔
return new Dell();
}
return null;
}
}
产品使用
public static void main(String[] args) {
Computer pc = new Computer();
Dell dell = (Dell) pc.createPc("戴尔");//买到戴尔
Msi msi = (Msi) pc.createPc("微星");//买到微星
}
简单工厂只适合于产品对象较少,且产品固定的需求,对于产品变化无常的需求来说显然不合适。