您的位置:首页 > 其它

设计模式之工厂模式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();  //运行汽车
}
}


我们发现此时如果想要增加一个奔驰车,就不需要再修改工厂类的中任何代码,只需增加奔驰类,奔驰工厂类即可,抽象工厂模式相对于工厂模式更符合开放-封闭原则,但同时也增加了更多的类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: