工厂模式

322 阅读4分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

工厂模式

工厂顾名思义就是创建产品,
根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,
根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
该模式用于封装和管理对象的创建,是一种创建型模式。

简单工厂

模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装;

优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则 image.png

演示

1、抽象产品

public interface Clothes {
    void make();
}

2、具体产品

public class Lining implements Clothes {
    public Lining() {
        this.make();
    }
    @Override
    public void make() {
        System.out.println("制作李宁衣服!");
    }
}

public class Erke implements Clothes {
    public Erke() {
        this.make();
    }
    @Override
    public void make() {
        System.out.println("制作鸿星尔克衣服!");
    }
}

3、具体工厂

public class ClothesFactory {
    public Clothes makeClothes(String name) {
        if ("Lining".equals(name)) {
            return new Lining(); 
        }
        if ("Erke".equals(name)) {
            return new Erke();
        }
        return null;
    }
}

4、演示

public class Client {
    public static void main(String[] args) {
        ClothesFactory factory = new ClothesFactory();
        factory.makeClothes("Lining"); // 制作李宁衣服!
        factory.makeClothes("Erke"); // 制作鸿星尔克衣服!
    }
}

工厂模式

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂;
核心的工厂类不再负责所有的产品的创建,该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度
  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

image.png

演示

在简单工厂演示上做修改

1、修改ClothesFactory为抽象工厂

public interface ClothesFactory {
    Clothes makeClothes();
}

2、新增具体产品工厂

public class LiningFactory implements ClothesFactory {
    @Override
    public Clothes makeClothes() {
        return new Lining();
    }
}

public class ErkeFactory implements ClothesFactory{
    @Override
    public Clothes makeClothes() {
        return new Erke();
    }
}

3、演示

public class Client {
    public static void main(String[] args) {
        ClothesFactory lining = new LiningFactory();
        lining.makeClothes(); // 制作李宁衣服!
        ClothesFactory erke = new ErkeFactory();
        erke.makeClothes(); // 制作鸿星尔克衣服!
    }
}

抽象工厂

一个产品需要对应的具体产品工厂制作,当这产品的系列的其他产品也可以通过这个具体产品工厂制作
所以工厂模式和抽象工厂模式的区别在于一个具体工厂生产一个产品与一个具体工厂生产多个不同产品

image.png

演示

在工厂模式的基础上做修改

1、新增一个抽象产品

public interface Shoe {
    void make();
}

2、新增具体产品

public class LiningShoe implements Shoe {
    public LiningShoe() {
        this.make();
    }
    @Override
    public void make() {
        System.out.println("制作李宁鞋子!");
    }
}

public class ErkeShoe implements Shoe{
    public ErkeShoe() {
        this.make();
    }
    @Override
    public void make() {
        System.out.println("制作鸿星尔克鞋子!");
    }
}

3、修改抽象工厂

public interface ClothesFactory {
    Clothes makeClothes();
    Shoe makeShoe();
}

4、修改具体工厂

public class LiningFactory implements ClothesFactory {
    @Override
    public Clothes makeClothes() {
        return new Lining();
    }
    @Override
    public Shoe makeShoe() {
        return new LiningShoe();
    }
}

public class ErkeFactory implements ClothesFactory{
    @Override
    public Clothes makeClothes() {
        return new Erke();
    }
    @Override
    public Shoe makeShoe() {
        return new ErkeShoe();
    }
}

5、演示

public class Client {
    public static void main(String[] args) {
        ClothesFactory lining = new LiningFactory();
        lining.makeClothes(); // 制作李宁衣服!
        lining.makeShoe(); // 制作李宁鞋子!
        ClothesFactory erke = new ErkeFactory();
        erke.makeClothes(); // 制作鸿星尔克衣服!
        erke.makeShoe(); // 制作鸿星尔克鞋子!
    }
}

总结

工厂模式最终的目的是:解耦、降低代码重复、降低维护成本

三种工厂模式各有各的应用场景,根据实际场景运用即可