抽象工厂模式
定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。
适用场景:
- 客户端不依赖于产品类实例如何被创建,实现等细节
- 强调一系列产品的产品对象一起使用创建对象需要大量的代码重复
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体的实现
优点:
- 具体产品在应用层的代码隔离,无需关心创建的细节
- 将一个系列的产品统一到一起创建
缺点:
- 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难
- 增加了系统的抽象性和理解难度
比如有小米和华为两种厂商,每一个厂商可以生产手机和路由器。那么我们先来创建手机产品和路由器产品的接口与实现类。
手机实现类:
每个厂商的手机都要实现手机这个接口
public interface Phone(){
void start();
void close();
void callup();
void goonline();
}
小米手机:
public class XiaomiPhone implements Phone {
public void start() {
System.out.println("小米--》开机");
}
public void close() {
System.out.println("小米--》关机");
}
public void callup() {
System.out.println("小米--》打电话");
}
public void goonline() {
System.out.println("小米--》上网");
}
public void Shout(){
System.out.println("干翻华为!");
}
华为手机:
public class HuaweiPhone implements Phone{
public void start() {
System.out.println("华为--》开机");
}
public void close() {
System.out.println("华为--》关机");
}
public void callup() {
System.out.println("华为——》打电话");
}
public void goonline() {
System.out.println("华为--上网");
}
}
路由器实现类:
每个厂商的路由器都要实现路由器这个接口
public interface Router {
void start();
void close();
void wifi();
void setWifi();
}
小米路由器:
public class XiaomiRouter implements Router{
public void start() {
System.out.println("小米路由器--》开机");
}
public void close() {
System.out.println("小米路由器--》关机");
}
public void wifi() {
System.out.println("小米路由器--》wifi");
}
public void setWifi() {
System.out.println("小米路由器--》设置wifi");
}
}
华为路由器:
public class HuaweiRouter implements Router{
public void start() {
System.out.println("华为路由器--》开机");
}
public void close() {
System.out.println("华为路由器--》关机");
}
public void wifi() {
System.out.println("华为路由器--》wifi");
}
public void setWifi() {
System.out.println("华为路由器--》设置wifi");
}
}
因为每个品牌的手机和路由器都要由自己的厂商工厂来创建那么接下来我们创建每个品牌工厂的接口和实现类,通过每个品牌的工厂来创建每个品牌自己的产品。
所有的工厂都要实现这个接口
public interface ProductFactory {
// 生产手机
PhoneProducts phoneproducts();
// 生产路由器
RouterProducts routerproducts();
}
小米工厂:
public class XiaomiFactory implements ProductFactory {
public PhoneProducts phoneproducts() {
return new XiaomiPhone();
}
public RouterProducts routerproducts() {
return new XiaomiRouter();
}
}
华为工厂:
public class HuaweiFactory implements ProductFactory{
public PhoneProducts phoneproducts() {
return new HuaweiPhone();
}
public RouterProducts routerproducts() {
return new HuaweiRouter();
}
}
这样一个抽象工厂的范例基本就完成了,接下来我们来创建一个用户来获得各类产品
public class User {
public static void main(String[] args) {
// 小米系列产品
// 创建一个小米工厂
XiaomiFactory xiaomiFactory = new XiaomiFactory();
// 通过小米工厂获得小米手机
PhoneProducts mi10 = xiaomiFactory.phoneproducts();
mi10.start();
mi10.callup();
// 通过小米工厂获得小米路由器
RouterProducts miRouter = xiaomiFactory.routerproducts();
miRouter.start();
miRouter.wifi();
// 创建一个华为工厂
HuaweiFactory huaweiFactory = new HuaweiFactory();
// 获得华为手机
PhoneProducts huaweiP40 = huaweiFactory.phoneproducts();
huaweiP40.start();
huaweiP40.goonline();
// 获得华为路由器
RouterProducts huaweiRouter = huaweiFactory.routerproducts();
huaweiRouter.start();
huaweiRouter.wifi();
}
}
感谢阅读
欢迎留言