设计模式----抽象工厂模式

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

总结:

三种工厂设计模式,不一定需要遵循开闭原则,根据实际业务选择相应的设计模式,一般来说,静态工模式使用的比较多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值