设计模式 -- 工厂模式

194 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

工厂模式主要有三种,先介绍一下简单工厂模式,顾名思义比较简单

含义: 利用单独的类来进行创造实例的过程,定义⼀个创建对象的接⼝,让接⼝的实现类决定创建哪种对象,让类的实例化推迟到⼦类中进行。

就像工厂一样,在工厂先建好机器,然后等待一系列物品进行生产,就拿咖啡举例吧

//首先创建一个咖啡的规范类
public interface Coffee{
    public String getName();
}
​
//然后定义工厂中生产的咖啡种类
public Americano interface Coffee{
    @Override
    public String getName(){
        return "Americano";
    }
}
​
public Latte interface Coffee{
    @Override
    public String getName(){
        return "Latte";
    }
}
    
public MoCha interface Coffee{
    @Override
    public String getName(){
        return "MoCha";
    }
}
​
//然后建立创建咖啡的工厂
public class CoffeeFactory{
    public Coffee createCoffee(String coffeeType){
        if (coffeeType.equals("Americano")){
            return new Americano();
        }else if (coffeeType.equals("Latte")){
            return new Latte();
        }else if(coffeeType.equals("MoCha"){
            return new MoCha();
        }
        return null; 
    }
}
                 
//现在我想喝咖啡了,我只需要告诉工厂我想喝什么,并不需要知道它的生产过程。
public static void main(String[] args){
    CoffeeFactory coffeeFactory = new CoffeeFactory();
    coffeeFactory.createCoffee("Americano");
}

接下来了解一下他的优缺点吧,优点显而易见,当想要创建对象时候,仅仅知道它的名称就可以了,并且屏蔽具体的实现过程,很好的体现了封装性;但是现在如果有很多种类咖啡的话,那么就要在工厂中增加大量的条件判断,不符合开闭原则,会使工厂类变得非常繁琐,也不符合单一职责原则,这就是它的缺点。

为了应对简单工厂模式的缺点,我们可以把生产各个产品的工厂也做抽象分离,即每个产品都有自己专门的工厂,顾名思义它叫工厂方法模式

//首先创建一个咖啡工厂的规范类
public interface CoffeeFactory{
    public Coffee createCoffee();
}
​
public class AmericanoFactory implements CoffeeFactory{
    @Override
    public Coffee createCoffee(){
        return new Americano();
    }
}
​
public class LatteFactory implements CoffeeFactory{
    @Override
    public Coffee createCoffee(){
        return new Latte();
    }
}
​
public class MoChaFactory implements CoffeeFactory{
    @Override
    public Coffee createCoffee(){
        return new MoCha();
    }
}
​
public static void main(String[] args){
    AmericanoFactory americanoFactory = new AmericanoFactory();
    AmericanoFactory.createCoffee();
}

这样一来,当我们想要新的种类的时候,只需要新建工厂就行了,同时能够满足开闭原则和单一职责原则。但是它虽然进一步优化了简单工厂模式,可它仍然需要创建大量的类,增加函数的复杂度。

可以看出上述两种模式都是对同一种类的物品进行生产的工厂,那么我们要生产汽车,衣服怎么办呢?总不能还用咖啡的工厂来生产吧。就算像奶茶一样有相似之处,复制修改相同的代码虽然也是可以,但是如果后期维护和扩展功能你就知道这种做法是多么愚蠢了。因此就发明出了随时改变的抽象工厂模式

//首先创建抽象工厂
abstract class AbstractFactory{
    public abstract void createProduct(String product);
}
​
//奶茶工厂
class BeerFactory extends AbstractFactory{
    @Override
    public void createProduct(String product){
        switch(product){
            case "Bubble Tea":
                return new BubbleTea();
                break;
            case "milk":
                return new Milk();
                break;
            default:
                return new othersTea();
                break;
        }
        return null;
    }
}
​
//咖啡工厂
class CoffeeFactory extends AbstractFactory{
    @Override
    public void createProduct(String product){
        switch(product){
            case "Americano":
                return new Americano();
                break;
            case "Latte":
                return new Latte();
                break;
            default:
                return new othersCoffee();
                break;
        }
        return null;
    }
}
​
public class AbstractFactoryTest{
    public static void main(String[] args) {
       // 抽象工厂
       new CoffeeFactory()).createProduct("Latte");
   }
}

虽然完善了简单工厂模式工厂方法模式不方便扩展产品族,并且增加了系统的抽象性和理解难度。

虽然看起来这三种工厂模式越来越好,但是并没有所谓的高级模式,只有适合使用的场景才是最好的,大家应该按照自己的需求找到最合适的模式。