抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类
1、优缺点
优点:
1.具体产品在应用层的代码隔离,无需关系创建的细节
2.将一个系列的产品统一到一起创建
缺点:
1.规定了所有可能被创建的产品集合,产品族中扩展新的产品困难;
2.增加了系统的抽象性和理解难度
2、使用场景
1.客户端(应用层)不依赖与产品类示例如何被创建、实现等细节
2.强调一系列相关的产品对象(数据同一产品族)一起使用创建对象需要大量的重复代码
3.提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现
3、具体实现
创建手机工厂
public interface IpnoneProduct{
void sendEamil();
void trunOff();
void trunOn();
void callUp();
}
模拟手机厂商小米制造手机
public class XiaomiPhone implements IpnoneProduct{
@Override
void sendEamil(){
System.out.pritln("小米手机发邮件")
}
@Override
void trunOff(){
System.out.pritln("小米手机关机")
}
@Override
void trunOn(){
System.out.pritln("小米手机开机")
}
@Override
void callUp(){
System.out.pritln("小米手机打电话")
}
}
模拟手机厂商华为制造手机
public class HuaweiPhone implements IpnoneProduct{
@Override
void sendEamil(){
System.out.pritln("华为手机发邮件")
}
@Override
void trunOff(){
System.out.pritln("华为手机关机")
}
@Override
void trunOn(){
System.out.pritln("华为手机开机")
}
@Override
void callUp(){
System.out.pritln("华为手机打电话")
}
}
模拟路由器工厂
public interface IRouterProduct{
void start();
void shutdown();
void openWife();
void setting();
}
模拟小米路由器
public class XiaomiRouter implements IRouterProduct{
@Override
public void start(){
System.out.println("启动小米路由器");
}
@Override
public void shutdown(){
System.out.println("关闭小米路由器");
}
@Override
public void openWife(){
System.out.println("打开小米路由器wifi");
}
@Override
public void setting(){
System.out.println("设置小米路由器");
}
}
模拟华为路由器
public class HuaweiRouter implements IRouterProduct{
@Override
public void start(){
System.out.println("启动华为路由器");
}
@Override
public void shutdown(){
System.out.println("关闭华为路由器");
}
@Override
public void openWife(){
System.out.println("打开华为路由器wifi");
}
@Override
public void setting(){
System.out.println("设置华为路由器");
}
}
模拟华为、小米都是一个厂商
他们都有产品手机、路由器
创建抽象产品工厂
public interface IProductFactory{
//生产手机
IphoneProduct iphoneProduct();
//生产路由器
IRouterProduct routerProduct();
创建小米工厂
public class XiaomiFactory implements IProductFactory{
@Override
public IphoneProduct iphoneProduct(){
return new XiaomiPhone();
}
@Override
public IRouterProduct routerProduct(){
return new XiaomiRouter();
}
创建华为工厂
public class HuaweiFactory implements IProductFactory{
@Override
public IphoneProduct iphoneProduct(){
return new HuaweiPhone();
}
@Override
public IRouterProduct routerProduct(){
return new HuaweiRouter();
}
创建客户端
public class Client{
public staic void main(String[] args){
System.out.println("=============小米系列产品=========");
//小米工厂
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
iphoneProduct.callup();
iphoneProduct.sendEamil();
IRouterProduct iRouterProduct = xiaomiFactory.routerProduct();
iRouterProduct.openWife();
System.out.println("=============华为系列产品=========");
//小米工厂
HuaweiFactory huaweiFactory = new HuaweiFactory();
iphoneProduct = huaweiFactory.iphoneProduct();
iphoneProduct.callup();
iphoneProduct.sendEamil();
iRouterProduct = huaweiFactory.routerProduct();
iRouterProduct.openWife();
}
}
分析类图: