设计模式之工厂方法模式笔记

说明

记录下学习设计模式-工厂方法模式的写法。

Factory Method(工厂方法)

意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
结构:
在这里插入图片描述
其中:

  • Product定义工厂方法所创建的对象的接口。
  • ConcreteProduct实现Product接口。
  • Creator声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的默认实现,它返回一个默认的ConcreteProduct对象,可以调用工厂方法以创建一个Product对象。
  • ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例。

适用性:

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

目录

在这里插入图片描述

UML工厂方法示例类图

在这里插入图片描述

以该UML类图实现工厂方法示例。

咖啡抽象类

package com.example.deesign_patterns.factory_method;

public abstract class Coffee {

    public abstract String getName();

    //加糖
    public void addSugar(){
        System.out.println("加糖");
    }

    //加奶
    public void addMilk(){
        System.out.println("加奶");
    }

}

美式咖啡类

package com.example.deesign_patterns.factory_method;

//美式咖啡类
public class AmericanCoffer extends Coffee {

    @Override
    public String getName() {
        return "美式咖啡";
    }
}

拿铁咖啡类

package com.example.deesign_patterns.factory_method;

//拿铁咖啡类
public class LatteCoffee extends Coffee {

    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

咖啡工厂接口

package com.example.deesign_patterns.factory_method;

//咖啡工厂类
public interface CoffeeFactory {

    //创建咖啡对象的方法
    Coffee createCoffee();
}

美式咖啡工厂类

package com.example.deesign_patterns.factory_method;

//美式咖啡工厂对象,专门用来生产美式咖啡
public class AmericanCofferFactory implements CoffeeFactory {

    @Override
    public Coffee createCoffee() {
        return new AmericanCoffer();
    }
}

拿铁咖啡工厂类

package com.example.deesign_patterns.factory_method;

//拿铁咖啡工厂对象,专门用来生产拿铁咖啡
public class LatteCoffeeFactory implements CoffeeFactory {

    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
}

咖啡店类

package com.example.deesign_patterns.factory_method;

//咖啡店类
public class CoffeeStore {

    private CoffeeFactory factory;

    public void setFactory(CoffeeFactory factory){
        this.factory=factory;
    }

    //点咖啡功能
    public Coffee orderCoffee(){
        Coffee coffee = factory.createCoffee();
        //添加配料
        coffee.addSugar();
        coffee.addMilk();
        return coffee;
    }
}

测试类

package com.example.deesign_patterns.factory_method;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建咖啡店对象
        CoffeeStore store = new CoffeeStore();
        //创建对象
        CoffeeFactory factory=new AmericanCofferFactory();
        //CoffeeFactory factory=new LatteCoffeeFactory();
        store.setFactory(factory);
        //点咖啡
        Coffee coffee=store.orderCoffee();
        System.out.println(coffee.getName());
    }
}

在这里插入图片描述

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则。

缺点
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值