抽象工厂模式是一种创建性设计模式,它允许客户端类创建一系列相关的对象,而无需指定它们的具体类别。这种模式使得产品组合的实现变得更加灵活和可定制。在本篇文章中,我们将通过一个实例来分析抽象工厂模式的应用及其优势。
实例描述
假设我们正在开发一个在线旅游预订平台,该平台需要根据用户提供的预订信息,从一系列的供应商中筛选出合适的酒店和航班。在这个场景下,我们需要系统能够通过一个抽象的工厂来创建不同的供应商工厂,并由这些工厂来创建不同的酒店和航班。
实现
在这个实例中,抽象工厂模式可以通过定义两个抽象工厂来实现:一个酒店工厂和一个航空公司工厂。每个工厂都会实现一个特定的接口,例如IHotelFactory和IAirlineFactory。这些工厂的实现类将会在抽象工厂的具体实现中定义。
使用抽象工厂模式后,客户端代码就可以将对具体工厂的直接引用替换为对抽象工厂的引用,从而解耦客户端与工厂之间的依赖。下面是具体实现的代码:
```java
interface IHotel {
void book();
}
class MarriottHotel implements IHotel {
@Override
public void book() {
System.out.println("Booked a room at Marriott Hotel.");
}
}
class HyattHotel implements IHotel {
@Override
public void book() {
System.out.println("Booked a room at Hyatt Hotel.");
}
}
interface IAirline {
void book();
}
class DeltaAirline implements IAirline {
@Override
public void book() {
System.out.println("Booked a flight with Delta Airline.");
}
}
class AmericanAirline implements IAirline {
@Override
public void book() {
System.out.println("Booked a flight with American Airline.");
}
}
interface IHotelFactory {
IHotel bookHotel();
}
class MarriottHotelFactory implements IHotelFactory {
@Override
public IHotel bookHotel() {
return new MarriottHotel();
}
}
class HyattHotelFactory implements IHotelFactory {
@Override
public IHotel bookHotel() {
return new HyattHotel();
}
}
interface IAirlineFactory {
IAirline bookAirline();
}
class DeltaAirlineFactory implements IAirlineFactory {
@Override
public IAirline bookAirline() {
return new DeltaAirline();
}
}
class AmericanAirlineFactory implements IAirlineFactory {
@Override
public IAirline bookAirline() {
return new AmericanAirline();
}
}
class TravelBooking {
private IHotelFactory hotelFactory;
private IAirlineFactory airlineFactory;
TravelBooking(IHotelFactory hotelFactory, IAirlineFactory airlineFactory) {
this.hotelFactory = hotelFactory;
this.airlineFactory = airlineFactory;
}
public void bookHotel() {
IHotel hotel = hotelFactory.bookHotel();
hotel.book();
}
public void bookAirline() {
IAirline airline = airlineFactory.bookAirline();
airline.book();
}
}
public class Main {
public static void main(String[] args) {
IHotelFactory marriottHotelFactory = new MarriottHotelFactory();
IHotelFactory hyattHotelFactory = new HyattHotelFactory();
IAirlineFactory deltaAirlineFactory = new DeltaAirlineFactory();
IAirlineFactory americanAirlineFactory = new AmericanAirlineFactory();
TravelBooking marriottBooking = new TravelBooking(marriottHotelFactory, deltaAirlineFactory);
marriottBooking.bookHotel();
marriottBooking.bookAirline();
TravelBooking hyattBooking = new TravelBooking(hyattHotelFactory, americanAirlineFactory);
hyattBooking.bookHotel();
hyattBooking.bookAirline();
}
}
```
在上面的代码中,我们定义了IHotel和IAirline接口,然后针对每个接口实现了两个具体的类,这些类分别实现了book方法,并在方法内部输出了特定的文本。接下来,我们定义了IHotelFactory和IAirlineFactory接口,然后又为每个接口实现了两个具体工厂类。每个工厂类都会从自己的注入IHotel或IAirline接口并返回特定的实例。
我们最后在TravelBooking类中实例化了marriottHotelFactory、deltaAirlineFactory、hyattHotelFactory以及americanAirlineFactory,然后将它们作为TravelBooking的构造函数参数传入,以便在bookHotel和bookAirline方法中使用。
优势
抽象工厂模式有以下优点:
1. 遵循开放封闭原则: 通过使用抽象工厂模式,您可以在不修改现有代码的情况下向应用程序中添加新的功能组件。
2. 分离客户端和具体类: 抽象工厂模式使得客户端能够通过接口而不是具体类来引用一些相关的工厂对象,从而使代码更加易于维护和扩展。
3. 提供了一种简单方式来管理相关的对象: 抽象工厂模式允许您在系统中组织、组装和管理相关对象,同时保持高水平的灵活性和可扩展性。
扫码咨询 领取资料