设计模式之工厂模式VS抽象工厂模式
2017-08-28 10:10
369 查看
一、工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
下面通过一个汽车生产工厂来体验一下工厂模式的优缺点。
(1) 定义汽车接口
//定义一个汽车接口 public interface ICar { //启动 void running(); }
(2) 定义三个实体类实现汽车接口
// 奥迪车 public class Audi implements ICar { @Override public void running() { System.out.println("一辆奥迪,使用97#汽油运行"); } }
//公交车 public class Bus implements ICar { @Override public void running() { System.out.println("一辆公交车,使用电力运行。"); } }
//拖拉机 public class Tractor implements ICar { @Override public void running() { System.out.println("一辆拖拉机,使用柴油工作。"); } }
(3) 定义工厂类,用来生产汽车
//汽车生产工厂 public class CarFactory { public static ICar createCar(String type){ ICar car = null ; switch (type){ case "bus" : car = new Bus(); break ; case "audi" : car = new Audi(); break ; case "tractor" : car = new Tractor(); break ; } return car ; } }
(4)客户端
public class Main { public static void main(String[] args) { //如果我需要一辆公交车,直接从工厂中提取 ICar bus = CarFactory.createCar("audi"); bus.running(); } }
运行结果为
一辆奥迪,使用97#汽油运行
很明显,已经达到我们预期的结果,如果想要改变生产的汽车,只需修改客户端中 CarFactory.createCar(
bb33
)方法中的参数就可以了。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
二、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
接着汽车生产工厂继续
(1) 抽象出一个汽车生产工厂
//抽象工厂 public interface ICarFactory { ICar createCar(); }
(2) 定义三个工厂,实现抽象工厂
//奥迪生产工厂 public class AudiFactory implements ICarFactory{ @Override public ICar createCar() { return new Audi(); } }
//公交车生产工厂 public class BusFactory implements ICarFactory{ @Override public ICar createCar() { return new Bus(); } }
//拖拉机生产工厂 public class TractorFactory implements ICarFactory{ @Override public ICar createCar() { return new Tractor(); } }
客户端测试
public class Main { public static void main(String[] args) { ICarFactory factory = new AudiFactory(); //创建一个奥迪生产工厂 ICar car = factory.createCar(); //通过工厂生产汽车 car.running(); //运行汽车 } }
我们发现此时如果想要增加一个奔驰车,就不需要再修改工厂类的中任何代码,只需增加奔驰类,奔驰工厂类即可,抽象工厂模式相对于工厂模式更符合开放-封闭原则,但同时也增加了更多的类。
相关文章推荐
- 设计模式之工厂设计模式(二:抽象工厂模式)
- 设计模式之工厂模式,抽象工厂模式
- 设计模式--工厂模式和抽象工厂模式
- JAVA设计模式之:工厂模式(下)--抽象工厂模式
- 设计模式理解之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- 设计模式之工厂模式、抽象工厂模式、单例模式(C++代码)
- java之设计模式工厂三兄弟之抽象工厂模式
- 设计模式之-抽象工厂模式VS简单工厂模式(python)
- 对设计模式的总结之工厂方法模式和抽象工厂模式
- 【设计模式】 模式PK:工厂模式VS建造者模式
- 设计模式之工厂模式系列(简单工厂,工厂模式,抽象工厂模式)
- java设计模式学习之工厂模式和抽象工厂模式
- 设计模式--工厂方法、抽象工厂模式
- 设计模式:抽象工厂模式(C++)【工厂方法升级】
- 【设计】工厂模式--C++源代码(VS2015)
- 设计模式(2)工厂模式、工厂方法模式、抽象工厂模式
- Java设计模式之工厂方法、抽象工厂模式 程序 总结
- PHP设计模式-工厂系列(三)-抽象工厂模式
- 设计模式之工厂方法模式VS简单工厂方法模式