工厂模式是Java23种设计模式中的一种比较常用的创建型模式。日常应用中,Java工厂模式被分为简单工厂模式、工厂方法模式和抽象工厂模式三种。其中,简单工厂模式又称为静态工厂模式,并不属于23种设计模式;工厂方法模式和抽象工厂模式是在简单工厂模式的基础上对Java工厂模式的进一步诠释。
一,简单工厂模式 :
1, UML类图 :
* 简单工厂模式中存在一个商品的工厂模型和一个向上抽取的商品接口;
* 具体商品类型分别作为商品接口的实现类,并在工厂模型类中依赖;
* 工厂模型通过factory()方法创建具体商品模型并多态返回具体商品对象;
* 多态返回的商品引用指向具体商品对象;
* 简单来说,简单工厂模式是对代码中if-else层级进行封装,使代码职能更加专一;
2,代码分析
* 工厂类
public class SimpleFactory {
public static Milk createMilk(String name) {
if("蒙牛".equals(name)) {
return new MengNiuMilk();
} else if("伊利".equals(name)) {
return new YiLiMilk();
} else if("特仑苏".equals(name)) {
return new TeLunSuMilk();
}
return null;
}
}
* 商品接口
public interface Milk {
String getName();
}
* 商品类
public class MengNiuMilk implements Milk {
@Override
public String getName() {
return "蒙牛";
}
}
public class TeLunSuMilk implements Milk {
@Override
public String getName() {
return "特仑苏";
}
}
public class YiLiMilk implements Milk {
@Override
public String getName() {
return "伊利";
}
}
* 测试类
public class SimpleFactoryTest {
public static void main(String[] args) {
Milk milk = SimpleFactory.createMilk("蒙牛");
System.out.println(milk.getName());
}
}
3,优缺点分析
* 简单工厂模式将具体对象的创建交由工厂来完成,在一定程度上精简了代码结构,从整体上对具体的创建提供了一个范式。
* 简单工厂模式只是将创建对象的动作进行了统一的向上抽取。在工厂中,如果因为也许需要产生了具体商品对象的添加, 需要在工厂中添加新的对象分支,不符合Java设计原则中的开闭原则。在复杂的业务场景中,并不能满足业务需求。
二,工厂方法模式 :
工厂方法模式是对简单工厂模式的完善,工厂方法模式提供一个向上的抽象工厂类,每一个具体的对象分别创建工厂并继承抽象工厂类。抽象工厂类提供统一的创建对象方法,具体工厂类重写后进行具体对象创建;
1,UML类图 :
* 工厂方法模式提供向上的商品类和工厂类;
* 分别创建若干的具体工厂类实现抽象工厂;
* 具体商品类实现商品接口并依赖于其对应的具体工厂类;
* 多态创建工厂,并通过工厂多态返回具体商品对象,完成对象创建;
2,代码
* 抽象工厂
public abstract class FunctionFactory {
public abstract Milk createMilk();
}
* 具体工厂
public class MengNiuFactory extends FunctionFactory {
@Override
public Milk createMilk() {
return new MengNiuMilk();
}
}
public class TeLunSuFactory extends FunctionFactory {
@Override
public Milk createMilk() {
return new TeLunSuMilk();
}
}
public class YiLiFactory extends FunctionFactory {
@Override
public Milk createMilk() {
return new YiLiMilk();
}
}
* 商品类及具体商品类同简单工厂模式;
* 测试类
public class FunctionFactoryTest {
public static void main(String[] args) {
FunctionFactory factory = new TeLunSuFactory();
Milk milk = factory.createMilk();
System.out.println(milk.getName());
FunctionFactory factory1 = new MengNiuFactory();
Milk milk1 = factory1.createMilk();
System.out.println(milk1.getName());
}
}
3,优缺点分析
* 工厂方法模式弥补了简单工厂模式中分支过多,代码维护困难的问题,符合Java开闭原则。
* 每一个商品的添加,都对应的需要添加一个具体的商品类和工厂类,这不可避免的造成整体类结构复杂。当然,也是商品模式的通病;
三,抽象工厂模式
同样,工厂方法模式和抽象工厂模式都会造成整个系统结构中类体系复杂,但是不同的是:工厂方法模式是一种无规则的类结构复杂,抽象工厂模式则是一种有规则的类结构复杂。抽象工厂提出了“产品族”的概念,是对简单工厂模式和工厂方法模式的一种向上整合,利用简单工厂模式和工厂方法模式的各自优势,进行整体结构的分模块化处理;
1,UML类图
* 抽象工厂模式提供了用于创建产品族的抽象工厂类和相对应的抽象产品接口;
* 具体工厂实现抽象工厂重写抽象方法;
* 各具体产品可根据简单工厂模型向上抽取工厂类,通过该产品结构下细分层级创建使用与不同产品结构的商品对象;
* 具体产品工厂类依赖于具体工厂进行产品族产品创建;
2,代码分析
* 抽象工厂类
public abstract class AbstractFactory {
public abstract Milk createMengNiuMilk();
public abstract Milk createYiLiMilk();
public abstract Milk createTeLunSuMilk();
}
* 具体工厂类
public class ShanXiProxyFactory extends AbstractFactory {
@Override
public Milk createMengNiuMilk() {
return new MengNiuFactory().createMilk();
}
@Override
public Milk createYiLiMilk() {
return new YiLiFactory().createMilk();
}
@Override
public Milk createTeLunSuMilk() {
return new TeLunSuFactory().createMilk();
}
}
public class BeiJingProxyFactory extends AbstractFactory {
@Override
public Milk createMengNiuMilk() {
return new MengNiuFactory().createMilk();
}
@Override
public Milk createYiLiMilk() {
return new YiLiFactory().createMilk();
}
@Override
public Milk createTeLunSuMilk() {
return new TeLunSuFactory().createMilk();
}
}
* 产品类和产品工厂类同上,未对产品工厂类进行产品结构细分
* 测试类
public class AbstractFactoryClass {
public static void main(String[] args) {
AbstractFactory factory = new ShanXiProxyFactory();
Milk milk = factory.createMengNiuMilk();
System.out.println(milk.getName());
}
}
3,优缺点分析
* 抽象工厂模式,提出了产品族的概念,对同一模块下的产品行为进行了整合,有利于模块化的业务模型处理;
* 不可否人,不合理的应用抽象工厂模式,极易产生类结构爆炸;
四,实例分析 :
举一个简单的例子,假如有一个小哥大学毕业开始创业,创业开了一家炸鸡排店,因为前期投入资金过小,就只有一个几平米左右的小店,小店经营炸鸡排,烤肉串还有果汁奶茶,小哥只有自己一个人在忙;
这样每次来一个顾客,提出自己的需求,小哥都需要根据每个客户的需求提供客户需要的产品,慢慢的小店生意见好,小店引入了冰淇淋等其他产品,小哥越来越力不从心,这时候就需要招聘店员。(简单工厂模式)
小哥招来了几个店员,让每一个店员负责每一种商品的生产,这样小店就有了专门做果汁奶茶的店员,专门炸鸡排的小哥,专门。。。,又过了一段时间,小哥店面越做越大,也越来越有知名度,慢慢的吸引了其他地方的小哥来寻求加盟了。(工厂方法模式)
加盟商的小店和小哥原来的小店虽然在产品上没有太大的区别,但是在选材和制作工艺上也有了细微的差异。这样小哥就确定了小店里面的基本商品,各个加盟商可以根据当地情况进行商品的适当扩展和产品加工的自主选择。每个加盟商小店就形成一套与其他小店不同的商品结构。(抽象工厂模式)