抽象工厂模式
- 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
- 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
**优点:**当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
**缺点:**产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
**注意事项:**产品族难扩展,产品等级易扩展。
实现代码
//为手机创建一个接口。
public interface IphoneProduct {
void start();
void end();
void sentMessage();
}
//创建实现手机接口的实体类。
public class XiaomiPhone implements IphoneProduct {
@Override
public void start() {
System.out.println("小米手机开机。");
}
@Override
public void end() {
System.out.println("小米手机关机。");
}
@Override
public void sentMessage() {
System.out.println("小米手机发短信。");
}
}
public class HuaweiPhone implements IphoneProduct {
@Override
public void start() {
System.out.println("华为手机开机。");
}
@Override
public void end() {
System.out.println("华为手机关机。");
}
@Override
public void sentMessage() {
System.out.println("华为手机发短信。");
}
}
//为路由器创建一个接口。
public interface IrouterProduct{
void start();
void end();
void setting();
}
//创建实现路由器接口的实体类。
public class XiaomiRouter implements IrouterProduct {
@Override
public void start() {
System.out.println("小米路由器开机。");
}
@Override
public void end() {
System.out.println("小米路由器关机。");
}
@Override
public void setting() {
System.out.println("小米路由器设置。");
}
}
public class HuaweiRouter implements IrouterProduct {
@Override
public void start() {
System.out.println("华为路由器开机。");
}
@Override
public void end() {
System.out.println("华为路由器关机。");
}
@Override
public void setting() {
System.out.println("华为路由器设置。");
}
}
//创建一个超级工厂
public interface IProductFactory {
IphoneProduct phoneProduct();
IrouterProduct routerProduct();
}
//创建不同的产品族工厂
public class XiaomiFactory implements IProductFactory {
@Override
public IphoneProduct phoneProduct() {
return new XiaomiPhone();
}
@Override
public IrouterProduct routerProduct() {
return new XiaomiRouter();
}
}
public class HuaweiFactory implements IProductFactory {
@Override
public IphoneProduct phoneProduct() {
return new HuaweiPhone();
}
@Override
public IrouterProduct routerProduct() {
return new HuaweiRouter();
}
}
public class Test {
public static void main(String[] args) {
System.out.println("========小米工厂产品========");
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct();
IrouterProduct irouterProduct = xiaomiFactory.routerProduct();
iphoneProduct.start();
iphoneProduct.end();
iphoneProduct.sentMessage();
irouterProduct.start();
irouterProduct.end();
irouterProduct.setting();
System.out.println();
System.out.println("========华为工厂产品========");
HuaweiFactory huaweiFactory = new HuaweiFactory();
IphoneProduct iphoneProduct1 = huaweiFactory.phoneProduct();
IrouterProduct irouterProduct1 = huaweiFactory.routerProduct();
iphoneProduct1.start();
iphoneProduct1.end();
iphoneProduct1.sentMessage();
irouterProduct1.start();
irouterProduct1.end();
irouterProduct1.setting();
}
}