设计模式-工厂模式

什么是工厂模式

工厂模式是用来创建对象的一种设计模式,不向外暴露创建对象的具体逻辑,而是将逻辑封装在一个方法中,那么这个方法就被视为工厂。
工厂模式可以具体分为三种

  • 简单工厂模式(不属于23种设计模式,是一种编程习惯,也叫静态工厂模式)
  • 工厂方法模式
  • 抽象工厂模式

简单工厂模式

简单工厂模式包含三个角色:

  • 抽象产品:规定了对象的规范
  • 具体产品:实现了抽象产品的子类
  • 具体工厂:静态方法,用来创建对象的工厂
//创建一个抽象类,抽象出子类的公共方法
public interface Coffee {

    void getName();

}
//静态工厂,用来调用静态方法创建对象。
public class SimpleCoffeeFactory {

    public static Coffee createCoffee(String type) {
        Coffee coffee = null;

        if ("americano".equals(type)) {
            coffee = new AmericanoCoffee();
        } else if ("latte".equals(type)) {
            coffee = new LatteCoffee();
        }
        return coffee;
    }

}

class AmericanoCoffee implements Coffee {
    @Override
    public void getName() {
        System.out.println("AmericanoCoffee");
    }
}

class LatteCoffee implements Coffee {
    @Override
    public void getName() {
        System.out.println("LatteCoffee");
    }
}

静态工厂模式的缺点:如果不断的增加新的产品,就要在不断的修改具体工厂的代码,违法了开闭原则。

工厂方法模式

工厂方法模式解决了简单工厂模式的缺点,核心结构有四个角色。

  • 抽象工厂:提供了创建产品的接口
  • 具体工厂:实现了抽象工厂接口,完成具体对象的创建过程。
  • 抽象产品:定义了产品的规范
  • 具体产品:实现了抽象产品的子类
//抽象产品
public interface Coffee {

    void getName();

}
//具体的产品
class AmericanoCoffee implements Coffee {
    @Override
    public void getName() {
        System.out.println("AmericanoCoffee");
    }
}

class LatteCoffee implements Coffee {
    @Override
    public void getName() {
        System.out.println("LatteCoffee");
    }
}
//抽象工厂
public interface CoffeeFactory {

    Coffee createCoffee();

}
//具体工厂
class AmericanCoffeeFactory implements CoffeeFactory {
    @Override
    public Coffee createCoffee() {
        return new AmericanoCoffee();
    }
}

class LatteCoffeeFactory implements CoffeeFactory {
    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
}

工厂方法模式解决了静态工厂模式的缺点,增加新的产品时只需要增加新的具体工厂类,不需要修改原来的代码。同时也带来了新的缺点,每增加一个新的产品类,就要增加一个对应的具体工厂类,提升了代码的复杂度。

抽象工厂模式

抽象工厂模式是工厂模式中最为抽象和最具有一般性的形态,解决了工厂方法模式的缺点
主要角色

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品
//抽象产品
public interface Coffee {

    void getName();

}
//具体产品
class AmericanoCoffee implements Coffee {
    @Override
    public void getName() {
        System.out.println("AmericanoCoffee");
    }
}

class LatteCoffee implements Coffee {
    @Override
    public void getName() {
        System.out.println("LatteCoffee");
    }
}
//抽象工厂
public interface DessertFactory {
    Coffee createCoffee();
    Dessert createDessert();
}
//具体工厂
public class AmericanDessertFactory implements DessertFactory {
    public Coffee createCoffee() {
        return new AmericanCoffee();
    }
    public Dessert createDessert() {
        return new MatchaMousse();
    }
}

public class ItalyDessertFactory implements DessertFactory {
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
    public Dessert createDessert() {
        return new Tiramisu();
    }
}

如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类。但是当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值