java设计模式之工厂方法模式

一:工厂方法模式介绍

1.什么是工厂方法模式?
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

2.工厂方法模式适合应用场景
1.当你在编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
2.工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。
3.例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。

3. 工厂方法模式优缺点
优点:
1你可以避免创建者和具体产品之间的紧密耦合。
2.单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
3.开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。
缺点:
1.应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。

二:工厂方法模式代码实现

需求:设计一个咖啡店点餐系统。
设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡和拿铁咖啡);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。

工厂方法模式的主要角色:
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂
方法来创建产品。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同
具体工厂之间一一对应。

抽象工厂

//咖啡类工厂生产各种咖啡
public interface CoffeeFactory {
	Coffee createCoffee();
}

具体工厂:

//拿铁咖啡
public class LatteCoffeeFactory implements CoffeeFactory {
	public Coffee createCoffee() {
		return new LatteCoffee();
}
}

//美式咖啡
public class AmericanCoffeeFactory implements CoffeeFactory {
	public Coffee createCoffee() {
		return new AmericanCoffee();
}
}
/**
 * @Author cgz
 * @Date 2022/11/16 12:27
 */
 //咖啡店
public class CoffeeStore {
    
    private CoffeeFactory factory;
    
    public CoffeeStore(CoffeeFactory factory){
        this.factory=factory;
    }
    
    public Coffee orderCoffee(String type){
        Coffee coffee =factory.createCoffee();
        coffee.addMilk();
        coffee.addsuagr();
        return  coffee;
    }
  //模拟controller层
 public static void main(String[] args) {
 		//源码不用动,如果新增加新需求就增加新的子类,去继承工厂,实现创建工厂的方法,再去新增加具体的产品,
 		//定义产品的逻辑,在其抽象方法上
        CoffeeStore coffeeStore =new CoffeeStore();
        coffeeStore.orderCoffee("咖啡类型");
    }
}
//将Coffee类做成抽象
public abstract class Coffee{
	protected String name; //名字
	
	//这个方法就是实现各个产品各自的特点
	public abstract void prepare();


	//加牛奶
	public void addMilk() {
		System.out.println(name + " addMilk;");
	}
	//加糖
	public void addsuagr() {
		System.out.println(name + " addsuagr;");
	}
	public void setName(String name) {
		this.name = name;
	}
//拿铁咖啡
public class LatteCoffee extends Coffee{
	//比如需求新增加产品
	//继承父类,并重写其方法,这样就是工厂模式每次只需要增加子类而不用改源代码的原因
	@Override
	public void prepare() {
		setName("拿铁咖啡");
		System.out.println(" 拿铁咖啡");
	}

//美式咖啡
public class AmericanCoffee extends Coffee{
	//比如需求新增加产品
	//继承父类,并重写其方法,这样就是工厂模式每次只需要增加子类而不用改源代码的原因
	@Override
	public void prepare() {
		setName("美式咖啡");
		System.out.println(" 美式咖啡");
	}

三:总结

工厂模式的好处就是新增加产品时候不需要改源代码,我听过一个大佬说过一句话,如果一层不能解决问题,那就再套一层,不断套层。
总的来说:我发现工厂方法模式,需要具体的产品(比如拿铁,美式咖啡),还有一个抽象的产品(coffee)给具体的产品继承(定义抽象方法),抽象工厂(定义方法),具体工厂实现抽象工厂的方法,咖啡店(定义一个方法调用工厂方法,返回一个抽象产品)

这样看起来工厂方法模式的实现步骤:
1.定义抽象工厂(定义一个方法**)
2.定义各个具体实现类实现抽象方法(增加产品时候就新增一个实现类)-
3.定义一个类获取抽象方法实例,再生成一个公有构造器,定义一个方法(给其他模块调用,比如Service层)
4.定义抽象的产品(抽象的产品定义一个方法)
5.定义具体的产品继承抽象的产品

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