工厂
将创建对象实例交给工厂,以创建不同的对象,减小系统耦合度。
实例
-
假设要生产不同的上衣,短袖/棉袄,我们应该怎么做?
// 上衣抽象类 public abstract class TopClothes { public abstract void show(); } // 短袖 public class ShortSleeve extends TopClothes{ @Override public void show() { System.out.println("我是短袖适合夏天穿"); } } // 棉袄 public class CottonClothes extends TopClothes { @Override public void show() { System.out.println("我是棉袄适合冬天穿"); } } // 工厂 public class TopClothesFactory { public TopClothes createTopClothes(String type) { if("shortSleeve".equals(type)) { return new ShortSleeve(); } else("CottonClothes".equals(type)){ return new CottonClothes(); } } }
-
上述就是简单工厂模式,由于工厂过于简单可以直接在创造方法上加上
static
就是静态工厂,但是有一个问题,如果添加新的上衣实现类,岂不是要在 TopClothesFactory.createTopClothes(String type) 中做修改,就违背了开放封闭原则。-
解决:此时工厂方法应运而生,为每一个上衣实现类都创造一个工厂方法
// 短袖工厂 public class ShortSleeveFactory { public TopClothes createTopClothes(String type) { return new ShortSleeve(); } } // 棉袄工厂 public class CottonClothesFactory { public TopClothes createTopClothes(String type) { return new CottonClothes(); } }
-
-
此时就可以称之为工厂方法模式,但是会发现每一个类对应一个工厂会产生类爆炸的问题。
-
如果此时我们要添加新的类,裤子
// 裤子 public abstract class Pants{} // 短裤 public class Shorts extends Pants{} // 棉裤 public class CottonPants extends Pants{}
-
此时如果按照工厂方法,工厂类的方法会非常多,但是在实际开发中会按照不同的业务逻辑为同种类型的的类生成一个工厂,例如上述的,短袖,棉袄,短裤,棉裤,可以生成夏季工厂 SummerClothesFactory 和 冬季工厂 WinterClothesFactory ,即抽象工厂
public abstract class ClothesFactory{ // 生成上衣 public abstract TopClothes createTopClothes(); // 生成裤子 public abstract Pants createPants(); } // 夏季衣服工厂 public class SummerClothesFactory extends ClothesFactory{ // 生成上衣 public TopClothes createTopClothes(){ return new ShortSleeve(); } // 生成裤子 public Pants createPants(){ return new Shorts(); } } // 冬季衣服工厂 public class WinterClothesFactory extends ClothesFactory{ // 生成上衣 public TopClothes createTopClothes(){ return new CottonClothes(); } // 生成裤子 public Pants createPants(){ return new CottonPants(); } }
-
类图
工厂方法
抽象工厂