二十三种设计模式之工厂模式
工厂方法模式 - 简单工厂模式 - 抽象工厂模式
1.概述
工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新的对象。
针对的问题
在面向对象编程中,最常用的方法是new一个操作符产生一个对象实例,new对象操作符就是用来构造对象实例的,但是在一些情况下,new操作符直接生成对象会带来一些问题,举例说,许多类型对象的创建都需要一系列的步骤,可能需要计算或取得对象的初始设置,选择生成哪个子对象实例,或者在生成需要的对象之前必须先生成一些辅助功能的对象,这些情况下,对象的建立就是一个过程,不仅仅是一个操作。
那怎样能够方便的构建对象实例,而不关心构造对象实例的细节和复杂过程呢,那就是建立一个工厂来创建对象,把创建的过程封装到工厂中。
工厂模式类型
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到灵活性的目的。
工厂模式一共三类
1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式
一般将简单工厂模式看为工厂方法模式的一种特例,两者归为一类。
三种工厂模式特征及实现
简单工厂模式
角色组成
1.工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。
2.抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3.具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
具体实现
1.产品类
abstract class BMW{ public BMW(){} }
2.具体产品类
//具体产品类 public class BMW100 extends BMW{ public BMW100(){ System.out.println("this is BMW100"); } } public class BMW200 extends BMW{ public BMW200(){ System.out.println("this is BMW200"); } }
3.工厂类
//工厂类 public class Factory{ public BMW CreateBMW(int type){ if(type ==100) return new BMW100(); if(type ==200) return new BMW200(); else return null; } }
分析
在简单工厂中,当客户不再满足现有的车型号时,想要一种更快的测,只要这种车满足抽象产品制定的规则,只要通知工厂类增加响应的逻辑就好了,但是每增加一种车,都要在工厂类中增加响应的逻辑,工厂类十分被动,这样的工厂类称为全能类或者上帝类。
工厂方法模式
角色构成
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品集成的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
实现
//抽象产品类 abstract class BMW() { public BMW(); }
// 具体产品类 四种车,宝马1系,(两种),2系(两种) public class BMW100 extends BMW { public BMW100() { System.out.println("this is BMW100"); } } public class BMW109 extends BMW { public BMW109() { System.out.println("this is BMW100"); } } public class BMW200 extends BMW { public BMW200() { System.out.println("this is BMW200"); } } public class BMW209 extends BMW { public BMW209() { System.out.println("this is BMW209"); } }
//抽象工厂角色 interface Factory { BMW createBMW(); }
//具体工厂角色 public class FactoryBMW1 implements FactoryBMW{ @Override public BMW100 createBMW() { return new BMW100(); } } public class FactoryBMW2 implements FactoryBMW { @Override public BMW200 createBMW() { return new BMW200(); } } //分为100的工厂和200的工厂(省略了两个工厂)。都实现了工厂的接口
分析
想加一辆车,就单独加车的类,这个车的工厂,然后只修改客户端的代码即可。工厂方法模式实现时,客户端需要决定实例化哪一个工厂来创建对象,工厂方法把简单工厂的内部逻辑移到了客户端代码来执行。
抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者互相依赖的对象。
抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们的类。就是一个工厂里放一些相关的类,使工厂数减少。
角色构成
实现代码
//抽象产品类1 发动机以及型号 public interface Engine { } //抽象产品类2 空调以及型号 public interface Aircondition { }
//具体产品类 public class EngineA extends Engine{ public EngineA(){ System.out.println("制造-->EngineA"); } } public class EngineB extends Engine{ public EngineB(){ System.out.println("制造-->EngineB"); } } public class AirconditionA extends Aircondition{ public AirconditionA(){ System.out.println("制造-->AirconditionA"); } } public class AirconditionB extends Aircondition{ public AirconditionB(){ System.out.println("制造-->AirconditionB"); } }
//抽象工厂 public interface AbstractFactory { //制造发动机 public Engine createEngine(); //制造空调 public Aircondition createAircondition(); }
//具体工厂类 public class 奔驰工厂 implements AbstractFactory{ @Override public Engine createEngine() { return new EngineA(); } @Override public Aircondition createAircondition() { return new AirconditionA(); } } //为宝马车生产配件 public class 宝马工厂 implements AbstractFactory { @Override public Engine createEngine() { return new EngineB(); } @Override public Aircondition createAircondition() { return new AirconditionB(); } }
分析
抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。它与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品登记结构;而抽象工厂模式则是针对的多个产品登记结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自不同的接口或抽象类。