一、认识抽象工厂模式
工厂模式主要分为三个:
(1)简单工厂模式:我们的衣服在工厂里面去建造,这就是简单工厂模式
(2)工厂方法模式:随着社会的发展,用户现在想要一身黑色的衣服、也想要一身红色的衣服。于是乎,我们开始定义一个总厂,下面有很多具体的工厂来生产不同颜色的衣服。
(3)抽象工厂模式:随着客户的要求越来越高,不同颜色衣服还要带各种不同的鞋子去搭配。于是这个工厂又开始生产衣服又要去生产鞋子。
今天我们将继续依照上一篇文章《工厂模式》来探讨一下抽象工厂模式,其实从上面的例子也可以看出,抽象工厂模式其实是工厂模式的升级。下面就来好好看一下抽象工厂模式的实现;
二、抽象工厂模式实现
对于抽象工厂模式,我们还是根据一张图来详细的分析一下
从上图我们可以看到,抽象工厂模式一共至少有5个角色:
(1)用户:提需求
(2)工厂接口:定义多个方法,比如可以生产鞋子,可以生产衣服的方法
(3)具体工厂:对工厂接口的实现,我们在里面生产指定的产品,比如红色衣服工厂,不仅可以生产红色衣服,还可以生产红鞋子、黑色鞋子
(4)抽象产品接口:比如这里的衣服还有鞋子
(5)具体产品类:具体的产品类。
如果上面的图你觉得还不足以刻画,那么直接来看代码:
第一步:抽象产品类定义
//首先是衣服产品 public abstract class ClothProduct { public ClothProduct() {} } //下面是鞋子产品 public abstract class ShoeProduct { public ShoeProduct() {}; }
第二步:具体产品类定义
首先是具体的衣服产品:红衣服和黑衣服
//红衣服 public class RedClothProduct extends ClothProduct{ public RedClothProduct() { System.out.println("生产红色衣服"); } } //黑衣服 public class BlackClothProduct extends ClothProduct { public BlackClothProduct() { System.out.println("生产黑色衣服"); } }
然后是具体的鞋子产品:红鞋子和黑鞋子
//红鞋子 public class RedShoeProduct extends ShoeProduct { public RedShoeProduct(){ System.out.println("制造--红鞋子"); } } //黑鞋子 public class BlackShoeProduct extends ShoeProduct { public BlackShoeProduct(){ System.out.println("制造--黑鞋子"); } }
第三步:工厂接口定义
public interface AbstractFactory { //制造衣服 public ClothProduct createClothProduct(); //制造鞋子 public ShoeProduct createShoeProduct(String shoeType); }
第四步:具体工厂定义
首先是红色衣服工厂:可以生产红衣服还有各种颜色的鞋子
public class RedClothFactory implements AbstractFactory{ //生产红鞋子 @Override public ClothProduct createClothProduct() { return new RedClothProduct(); } //根据不同的类型生产不同的鞋子 @Override public ShoeProduct createShoeProduct(String shoeType) { switch (shoeType) { case "red": return new RedShoeProduct(); case "black": return new BlackShoeProduct(); default: break; } return null; } }
其次是黑色衣服工厂:可以生产黑衣服还有各种颜色的鞋子
public class BlackClothFactory implements AbstractFactory{ //生产黑鞋子 @Override public ClothProduct createClothProduct() { return new BlackClothProduct(); } //根据不同的类型生产不同的鞋子 @Override public ShoeProduct createShoeProduct(String shoeType) { switch (shoeType) { case "red": return new RedShoeProduct(); case "black": return new BlackShoeProduct(); default: break; } return null; } }
第五步:用户类
public class User { public static void main(String[] args){ //生产红衣服系列 RedClothFactory redfactory=new RedClothFactory(); redfactory.createClothProduct(); redfactory.createShoeProduct("red"); //redfactory.createShoeProduct("black"); //生产黑衣服系列 BlackClothFactory blackfactory=new BlackClothFactory(); blackfactory.createClothProduct(); blackfactory.createShoeProduct("red"); //blackfactory.createShoeProduct("black"); } }
关于抽象工厂模式与工厂方法模式的区别,这里就不说了,感觉多看几遍例子就能理解。
三、总结
根据前面写的两篇文章,我们可能会发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,目的都是为了代码的解耦。在使用时,只需要关心降低耦合度的目的是否达到了。