什么是工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类;
简单解释
与简单工厂模式的区别
简单工厂模式的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的去实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂模式将选择判断的逻辑由服务端移到了客户端,去客户端去判断实现。
UML类图
- Product 定义工厂方法所创建的对象接口
- ConcreateProduct 具体的产品,实现了Product的接口
- Creator 声明工厂方法,该方法返回一个Product的类型对象
- ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例
简单工厂缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
工厂方法模式优点
- 更符合开-闭原则
- 符合单一职责原则
- 不使用静态工厂方法,可以形成基于继承的等级结构。
代码解释
以生产饼干为例
- 创建饼干抽象类,并定义一个获取饼干的方法
/**
* 定义一个饼干抽象类,并定义抽象方法生产饼干
* @author ws
* @version 1.0
*/
public abstract class Biscuits {
/**
* 获取饼干信息
* @return
*/
public abstract String getCookies();
}
- 声明牛奶饼干、巧克力饼干并继承饼干抽象类,
/**
* 继承饼干抽象类,并实现获取饼干方法
* @author ws
* @version 1.0
*/
public class MilkBiscuits extends Biscuits {
@Override
public String getCookies() {
return "牛奶饼干";
}
}
/**
* 继承饼干抽象类,并实现获取饼干方法
* @author ws
* @version 1.0
*/
public class ChocolateBiscuit extends Biscuits {
@Override
public String getCookies() {
return "巧克力饼干";
}
}
- 声明一个抽象工厂类,获取饼干
/**
* 定义饼干工厂类
* @author ws
* @version 1.0
*/
public abstract class BiscuitsFactory {
public abstract Biscuits getBiscuits();
}
- 声明牛奶饼干工厂、巧克力饼干工厂并继承至饼干抽象工厂
/**
* 牛奶饼干工厂类,返回实例化的牛奶饼干
* @author ws
* @version 1.0
*/
public class MilkBiscutisFactory extends BiscuitsFactory {
@Override
public Biscuits getBiscuits() {
return new MilkBiscuits();
}
}
/**
* 巧克力饼干工厂类,返回实例化的巧克力饼干
* @author ws
* @version 1.0
*/
public class ChocolateBiscuitFactory extends BiscuitsFactory {
@Override
public Biscuits getBiscuits() {
return new ChocolateBiscuit();
}
}
- 运行结果
public static void main(String[] args) {
BiscuitsFactory factory=new ChocolateBiscuitFactory();
Biscuits biscuits=factory.getBiscuits();
System.out.println(biscuits.getCookies());
}
巧克力饼干
参考:大话设计模式、工厂方式模式
网友评论