1.抽象工厂介绍
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。围绕一个超级工厂创建其他工厂,该超级工厂又称为工厂的工厂。
客户端(应用层)不依赖于产品类实例如何被创建,实现等细节。比如手机,无需关心如何创建,很多厂商都可以做厂商。强调一系列的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码。提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现。
优点:具体产品在应用层的代码隔离,无需关心创建的细节。将一个系列的产品统一到一起。
缺点:规定了所有可能创建的产品集合,产品族中扩展新的产品比较困难
抽象工厂例子代码
该例子为华为和小米都有两个公共产品即手机和路由器。
手机接口:
package factory.abstract1;
//手机产品接口
public interface IphoneProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}
路由器接口:
package factory.abstract1;
//路由器产品接口
public interface IRouterProdudct {
void strat();
void shutdown();
void openWifi();
void setting();
}
小米对应的产品:
package factory.abstract1;
public class XiaomiPhone implements IphoneProduct {
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("开启小米手机");
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
System.out.println("关闭小米手机");
}
@Override
public void callup() {
// TODO Auto-generated method stub
System.out.println("小米手机打电话");
}
@Override
public void sendSMS() {
// TODO Auto-generated method stub
System.out.println("小米手机发短信");
}
}
package factory.abstract1;
//小米厂商生产的路由器
public class XiaomiRouter implements IRouterProdudct {
@Override
public void strat() {
// TODO Auto-generated method stub
System.out.println("小米路由器开机");
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
System.out.println("小米路由器关机");
}
@Override
public void openWifi() {
// TODO Auto-generated method stub
System.out.println("小米路由器开启wifi");
}
@Override
public void setting() {
// TODO Auto-generated method stub
System.out.println("小米路由器设置密码");
}
}
华为厂商对应的产品:
package factory.abstract1;
//华为手机工厂
public class HuaweiPhone implements IphoneProduct {
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("开启华为手机");
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
System.out.println("关闭华为手机");
}
@Override
public void callup() {
// TODO Auto-generated method stub
System.out.println("华为手机打电话");
}
@Override
public void sendSMS() {
// TODO Auto-generated method stub
System.out.println("华为手机发短信");
}
}
package factory.abstract1;
//华为厂商生产路由器
public class HuaweiRouter implements IRouterProdudct {
@Override
public void strat() {
// TODO Auto-generated method stub
System.out.println("华为路由器开机");
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
System.out.println("华为路由器关机");
}
@Override
public void openWifi() {
// TODO Auto-generated method stub
System.out.println("华为路由器开启wifi");
}
@Override
public void setting() {
// TODO Auto-generated method stub
System.out.println("华为路由器设置密码");
}
}
工厂的工厂:即抽象工厂
package factory.abstract1;
//抽象产品工厂,用来约束具体工厂的生产规则
//抽象工厂用来规定具体的生产规则,定义一套统一的标准,然后每个产品族工厂来实现这个接口。比如华为产品族工厂
//创建对应的HuaweiFactory来实现这个抽象产品工厂
//即华为和小米的厂商生产的产品必须要相对应,
//想要修改的违反开闭原则,
//增加厂商简单,但增加产品困难
public interface IProductFactory {
//生产手机
IphoneProduct iphoneProduct();
//生产路由器
IRouterProdudct irouterProdudct();
}
小米工厂:
package factory.abstract1;
//小米的工厂
public class XiaomiFactroy implements IProductFactory {
@Override
public IphoneProduct iphoneProduct() {
// TODO Auto-generated method stub
return new XiaomiPhone();
}
@Override
public IRouterProdudct irouterProdudct() {
// TODO Auto-generated method stub
return new XiaomiRouter();
}
}
华为厂商:
package factory.abstract1;
//华为的工厂
public class HuaweiFactory implements IProductFactory {
@Override
public IphoneProduct iphoneProduct() {
// TODO Auto-generated method stub
return new HuaweiPhone();
}
@Override
public IRouterProdudct irouterProdudct() {
// TODO Auto-generated method stub
return new HuaweiRouter();
}
}
客户端调用:
package factory.abstract1;
public class Client {
public static void main(String args[]) {
System.out.println("===========小米系列产品===========");
//小米工厂
XiaomiFactroy xiaomiFactroy = new XiaomiFactroy();
IphoneProduct xiaomiPhone = xiaomiFactroy.iphoneProduct();
xiaomiPhone.callup();
xiaomiPhone.sendSMS();
IRouterProdudct xiaomiRouter = xiaomiFactroy.irouterProdudct();
xiaomiRouter.setting();
xiaomiRouter.openWifi();
System.out.println("===========华为系列产品===========");
//小米工厂
HuaweiFactory hauweiFactroy = new HuaweiFactory();
IphoneProduct hauweiPhone = hauweiFactroy.iphoneProduct();
hauweiPhone.callup();
hauweiPhone.sendSMS();
IRouterProdudct hauweiRouter = hauweiFactroy.irouterProdudct();
hauweiRouter.setting();
hauweiRouter.openWifi();
}
}
执行结果:
===========小米系列产品===========
小米手机打电话
小米手机发短信
小米路由器设置密码
小米路由器开启wifi
===========华为系列产品===========
华为手机打电话
华为手机发短信
华为路由器设置密码
华为路由器开启wifi
总结:
三种工厂设计模式,不一定需要遵循开闭原则,根据实际业务选择相应的设计模式,一般来说,静态工模式使用的比较多。