设计模式--工厂方法模式

什么是工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类;

简单解释

与简单工厂模式的区别

简单工厂模式的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的去实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂模式将选择判断的逻辑由服务端移到了客户端,去客户端去判断实现。

UML类图

image
  • Product 定义工厂方法所创建的对象接口
  • ConcreateProduct 具体的产品,实现了Product的接口
  • Creator 声明工厂方法,该方法返回一个Product的类型对象
  • ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例
image

简单工厂缺点

  • 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
  • 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
  • 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

工厂方法模式优点

  • 更符合开-闭原则
  • 符合单一职责原则
  • 不使用静态工厂方法,可以形成基于继承的等级结构。

代码解释

以生产饼干为例

  • 创建饼干抽象类,并定义一个获取饼干的方法
/**
 * 定义一个饼干抽象类,并定义抽象方法生产饼干
 * @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());
    }
巧克力饼干    

参考:大话设计模式、工厂方式模式

你可能感兴趣的:(设计模式--工厂方法模式)