设计模式之工厂方法模式笔记
- 说明
- Factory Method(工厂方法)
- 目录
- UML抽象工厂示例类图
- 咖啡抽象类
- 美式咖啡类
- 拿铁咖啡类
- 咖啡工厂接口
- 美式咖啡工厂类
- 拿铁咖啡工厂类
- 咖啡店类
- 测试类
说明
记录下学习设计模式-工厂方法模式的写法。
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());
}
}
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则。
缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。