定义
工厂模式属于创建型模式 ,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象
介绍 作用: 实现了创建者和调用者的分离
满足的OOP七大原则:
核心本质:
实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制。从而将调用者和我们的实现类解耦
注意:
对于复杂类,推荐使用工厂模式
对于简单类,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式(如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度)
详细分类 简单工厂模式(静态工厂模式) 一句话介绍: ①增加一个中间工厂类,用于创建产品对象 ②方法是静态的
不推荐使用
之所以静态工厂模式,是因为工厂的方法是静态的方法
对于新增的产品,需要去覆盖已经存在的代码
用来生产同一等级结构 中的任意产品
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 interface Car { void printName () ; } class smallCar implements Car { @Override public void printName () { System.out.println("smallCar" ); } } class largeCar implements Car { @Override public void printName () { System.out.println("largeCar" ); } } public class CarFactory { public static Car getCar (String car) { switch (car) { case "smallCar" : return new smallCar(); case "largeCar" : return new largeCar(); default : return null ; } } public static Car getSmallCar () { return new smallCar(); } public static Car getLargeCar () { return new largeCar(); } } class consumer { public static void main (String[] args) { CarFactory.getCar("smallCar" ).printName(); CarFactory.getSmallCar().printName(); CarFactory.getLargeCar().printName(); } }
上面的是静态工厂的写法,根据调用者传入给静态工厂的参数(或者根据调用的方法),从而决定创建的是何种汽车类型
虽然看起来简单,但是有缺点
工厂方法模式 一句话介绍: ①增加一个中间工厂接口 ②每增加一种产品,就要增加一个对应工厂类实现工厂接口 ③创建产品工作交给工厂完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 interface Car { void printName () ; } class SmallCar implements Car { @Override public void printName () { System.out.println("smallCar" ); } } class LargeCar implements Car { @Override public void printName () { System.out.println("largeCar" ); } } public interface CarFactory { Car getCar () ; } class SmallCarFactory implements CarFactory { @Override public Car getCar () { return new SmallCar(); } } class LargeCarFactory implements CarFactory { @Override public Car getCar () { return new LargeCar(); } } class Consumer { public static void main (String[] args) { System.out.println(new SmallCarFactory().getCar()); System.out.println(new LargeCarFactory().getCar()); } }
优点:
一个调用者想创建一个对象,只要知道其名称就可以了
扩展性高(因为满足开闭原则),如果想要增加一个产品,只要扩展一个工厂类就可以
屏蔽产品的具体实现,调用者只关心产品的接口
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这不是什么好事。
抽象工厂模式 也是一种创建型模式
一句话介绍: 围绕一个超级工厂创建其他工厂。该超级工厂又称为工厂的工厂。
具体介绍转战到另一篇博客:23种设计模式(5)-抽象工厂模式