本文内容来自慕课网系列课程,记录下学习的内容。
Java设计模式三
工厂模式
什么情况下适合工厂模式?
- 有一组类似的对象需要创建
- 在编码时不能预见需要创建哪种类的实例
- 系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节
工厂模式应用
本例子的内容是,创建发型
首先定义一个发型接口HairInterface
/*
* 发型接口
*/
public interface HairInterface {
public void draw();
}
然后定义两个实现HairInterface
接口的类,LeftHair
和RightHair
public class LeftHair implements HairInterface {
@Override
public void draw() {
System.out.println("左偏分发型");
}
}
然后创建一个工厂类HairFactory
/*
* 发型工厂
*/
public class HairFactory {
/**
* 根据类型来创建对象
* @param key
* @return
*/
public HairInterface getHair(String key) {
if ("left".equals(key)) {
return new LeftHair();
}else if("right".equals(key)){
return new RightHair();
}
return null;
}
}
这样就可以通过HairFactory
的getHair
方法来创建发型了
这样做还有确定,假设还有别的发型,则在getHair
方法中还要进行多个判断。
根据类的名称来创建对象
/**
* 根据类的名称来创建对象
* @return
*/
public HairInterface getHairByClass(String className) {
try {
HairInterface hair = (HairInterface) Class.forName(className).newInstance();
return hair;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
抽象工厂模式
常见应用:
1.JDBC
2.spring beanfactory
责任链模式
责任链模式
在责任链模式中,作为请求接受者的多个对象通过对其后继的引用而连接起来形成一条链,请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接受者都可以选择自行处理请求或是向后继传递请求。
这里以销售为例
首先创建一个抽象类PriceHandler
,价格处理人,负责处理客户折扣请求
/*
* 价格处理人,负责处理客户折扣请求
*/
public abstract class PriceHandler {
/**
* 直接后继,用于传递请求
*/
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 处理折扣申请
*/
public abstract void processDiscount(float discount);
}
创建如下类:
Sales
销售人员,可以批准5%以内的折扣Manager
销售经理,可以批准30%以内的折扣Director
销售总监,可以批准40%以内的折扣CEO
,可以批准55%以内的折扣
Sales
类如下,其它基本类似:
/*
* 销售人员,可以批准5%以内的折扣
*/
public class Sales extends PriceHandler{
@Override
public void processDiscount(float discount) {
if (discount <= 0.05) {
System.out.format("%s批准了折扣:%.2f", this.getClass().getName(), discount);
}else{
successor.processDiscount(discount);
}
}
}
CEO
类如下:
/*
* CEO,可以批准55%以内的折扣
*/
public class CEO extends PriceHandler {
@Override
public void processDiscount(float discount) {
if (discount <= 0.55) {
System.out.format("%s批准了折扣:%.2f", this.getClass().getName(), discount);
}else{
System.out.format("%s拒绝了折扣:%.2f", this.getClass().getName(), discount);
}
}
}
创建一个Customer
类,请求折扣
/*
* 客户类,请求折扣
*/
public class Customer {
private PriceHandler priceHandler;
public void setPriceHandler(PriceHandler priceHandler) {
this.priceHandler = priceHandler;
}
public void requestDiscount(float discount) {
priceHandler.processDiscount(discount);
}
public static void main(String[] args) {
Customer customer = new Customer();
customer.setPriceHandler(PriceHandler.createPriceHandler());
customer.requestDiscount(0.96f);
}
}
在PriceHandler
中添加一个工程方法
public static PriceHandler createPriceHandler() {
PriceHandler sales = new Sales();
PriceHandler manager = new Manager();
PriceHandler director = new Director();
PriceHandler ceo = new CEO();
sales.setSuccessor(manager);
manager.setSuccessor(director);
director.setSuccessor(ceo);
return sales;
}