设计模式之抽象工厂模式

来源:互联网 发布:cpda数据分析师 假 编辑:程序博客网 时间:2024/06/04 00:33

阅读本文前请先阅读《设计模式前言》

抽象工厂模式

在原博主的博文中并没有对抽象工厂模式进行介绍,所以我只好将自己学习的总结了一下。

抽象工厂模式的定义是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。这涉及到了产品族的概念。所以在介绍抽象工厂模式前,先要了解一下产品等级结构和产品族的概念:

产品等级结构——产品等级结构即产品的继承结构,如一个抽象类是跑车,其子类有奔驰跑车、宝马跑车,则抽象跑车与具体品牌的跑车之间构成了一个产品等级结构,抽象跑车是父类,而具体品牌的跑车是其子类。我们之前的工厂方法模式主要针对的是产品等级结构。

产品族——产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如奔驰汽车厂可以生产跑车和商务车,奔驰跑车位于跑车的等级结构中,奔驰商务车位于商务车等级结构中,那么奔驰的跑车和商务车构成了一个产品族。我们的抽象工厂模式针对的就是产品族。

例子如下:

首先是跑车和商务车的接口:

public interface Sportscar {public void method();}
public interface Businesscar {public void method();}
然后是具体的产品:

public class BenzSportsCar implements Sportscar {@Overridepublic void method() {// TODO Auto-generated method stubSystem.out.println("a BenzSportsCar");}}
public class BenzBusinessCar implements Businesscar {@Overridepublic void method() {// TODO Auto-generated method stubSystem.out.println("a BenzBusinessCar");}}
public class BMWSportsCar implements Sportscar {@Overridepublic void method() {// TODO Auto-generated method stubSystem.out.println("a BMWSportsCar");}}
public class BMWBusinessCar implements Businesscar {@Overridepublic void method() {// TODO Auto-generated method stubSystem.out.println("a BMWBusinessCar");}}
接下来是抽象工厂类及具体实现:

public abstract class BenzCarFactory {public abstract  void CreateSportsCar();public abstract  void CreateBussinessCar();}
public abstract class BMWCarFactory {public abstract  void CreateSportsCar();public abstract  void CreateBussinessCar();}
public class ConcreteBenzFactory extends BenzCarFactory {@Overridepublic void CreateSportsCar() {// TODO Auto-generated method stubSystem.out.println("Create a BenzSportsCar");}@Overridepublic void CreateBussinessCar() {// TODO Auto-generated method stubSystem.out.println("Create a BenzBusinessCar");}}
public class ConcreteBMWFactory extends BMWCarFactory {@Overridepublic void CreateSportsCar() {// TODO Auto-generated method stubSystem.out.println("Create a BMWSportsCar");}@Overridepublic void CreateBussinessCar() {// TODO Auto-generated method stubSystem.out.println("Create a BMWBusiinessCar");}}
最后是测试:

public class Client {public static void main(String[] args) {BenzCarFactory benzfactory = new ConcreteBenzFactory();benzfactory.CreateSportsCar();benzfactory.CreateBussinessCar();BMWCarFactory bmwfactory = new ConcreteBMWFactory();bmwfactory.CreateSportsCar();bmwfactory.CreateBussinessCar();}}
结果如下:


总结:抽象工厂模式与工厂方法模式的区别仅仅在于有多少个产品体系结构(抽象类),在思想及目的(解耦)上都是一样的,所以我们在使用时不需要特别在意使用的是哪种模式,只需要关注解耦的目的是否达到即可。









0 0