您的位置 首页 java

设计模式 | 工厂方法模式

一、 工厂方法模式 概述

工厂方法模式( Factory Method Pattern)又称为工厂模式,是一种 创建型设计模式

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。

二、工厂方法模式结构图

工厂方法模式结构图

工厂方法模式包含如下4种角色:

(1) Factory :抽象工厂,是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

(2) ConcreteFactory :具体工厂,这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

(3) Product :抽象产品,工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

(4) ConcreteProduct :具体产品,这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。。

三、工厂方法模式的适用场景

工厂方法模式主要适用于以下应用场景:

(1)创建对象需要使用大量的重复代码;

(2)客户端不依赖产品类实例如何被创建、如何实现等细节;

(3)一个类通过其子类来指定创建哪个对象。

四、工厂方法模式的优缺点

优点

(1)灵活性增强,对于新产品的创建,只需要多写一个相应的工厂类。

(2)典型的 解耦 框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、 依赖倒置原则 和里氏替换原则。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

五、代码实现

Coffee. java —— 抽象产品

 /**
 * @description 咖啡父类(抽象产品类)
 */public interface Coffee {
    /** 获取名称 */     String  getName();
    /** 加奶 */     void  addMilk();
    /** 加糖 */    void addSugar();
}  

LatteCoffee.java —— 拿铁( 具体产品

 /**
 * @description 拿铁(具体产品类)
 */public class LatteCoffee implements Coffee {
    @Override
    public String getName() {
        return "拿铁";
    }

    @Override
    public void addMilk() {
        System.out.println("给拿铁加奶!");
    }

    @Override
    public void addSugar() {
        System.out.println("给拿铁加糖!");
    }
}  

AmericanCoffee.java —— 美式咖啡 具体产品

 /**
 * @description 美式咖啡(具体产品类)
 */public class AmericanCoffee implements Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }

    @Override
    public void addMilk() {
        System.out.println("给美式咖啡加奶!");
    }

    @Override
    public void addSugar() {
        System.out.println("给美式咖啡加糖!");
    }
}  

CoffeeFactory.java —— 咖啡工厂类( 抽象工厂

 /**
 * @description 咖啡工厂类(抽象工厂类)
 */public interface CoffeeFactory {
    /** 创建咖啡 */    Coffee create();
}  

LatteCoffeeFactory.java —— 拿铁咖啡工厂类( 具体工厂

 /**
 * @description 拿铁咖啡工厂类(具体工厂类)
 */public class LatteCoffeeFactory implements CoffeeFactory{
    @Override
    public Coffee create() {
        return new LatteCoffee();
    }
}  

AmericanCoffeeFactory.java —— 美式咖啡工厂类( 具体工厂

 /**
 * @description 美式咖啡工厂类(具体工厂类)
 */public class AmericanCoffeeFactory implements CoffeeFactory {
    @Override
    public Coffee create() {
        return new AmericanCoffee();
    }
}  

测试

 public  static  void main(String[] args) {
    CoffeeFactory coffeeFactory = new AmericanCoffeeFactory();
    Coffee coffee = coffeeFactory.create();
    System.out.println(coffee.getName());
    coffee.addMilk();
    coffee.addSugar();

    coffeeFactory = new LatteCoffeeFactory();
    coffee = coffeeFactory.create();
    System.out.println(coffee.getName());
    coffee.addMilk();
    coffee.addSugar();
}  

输出结果

 美式咖啡
给美式咖啡加奶!
给美式咖啡加糖!
拿铁
给拿铁加奶!
给拿铁加糖!  

文章来源:智云一二三科技

文章标题:设计模式 | 工厂方法模式

文章地址:https://www.zhihuclub.com/187866.shtml

关于作者: 智云科技

热门文章

评论已关闭

4条评论

  1. Inzucchi SE, Zinman B, Fitchett D, Wanner C, Ferrannini E, Schumacher M, Schmoor C, Ohneberg K, Johansen OE, George JT et al

  2. This is often related to excessive levels of estrogen or estrogen like compounds, and not enough progesterone

  3. Table 2 outlines antimicrobial options for common infectious causes of hemolytic anemia The seven day pretreatment of SCFAs, including butyrate, restored the CD8 T cell functions, increased antibody responses, and prevented the influenza infection in mice 36, 72

  4. As a neuro nutritionist who has invented a number of cognitive enhancing products, as well as provided EEG neurofeedback and other cognitive training, I believe that this serious side effect can be overcome Bacterial bacterial cell interactions in biofilms detection of polysaccharide intercellular adhesins by blotting and confocal microscopy

网站地图