工厂模式(Factory Pattern)

  工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

  在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

一、简单工厂&静态工厂

1、简单工厂

package com.lcl.galaxy.design.pattern.factory;

public class AnimalFactory {
    public static Animal CreateAnimal(String name){
        if ("dog".equals(name)){
            return new Dog();
        }else if("cat".equals(name)){
            return new Cat();
        }
        return null;
    }
}

调用

    @Test
    public void factoryTest(){
        Animal animal = AnimalFactory.CreateAnimal("cat");
        animal.eat();
    }

2、静态工厂

public abstract class StaticAnimalFactory {
    public abstract Animal createAnimal();
}
public class CatFactory extends StaticAnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}
public class DogFactory extends StaticAnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

调用

    @Test
    public void factoryTest1(){
        StaticAnimalFactory factory = new CatFactory();
        Animal animal = factory.createAnimal();
        animal.eat();
    }

   优点:可以通过一个类进行创建所有内容,简单、易懂

   缺点:1、所有创建对象都放到了一个类中,如果需要创建的对象很多,该类就会很庞大

      2、违反了开闭设计原则,如果新增一个对象,就需要调整工厂类

二、抽象工厂模式

  抽象工厂模式主要就是将一个维度的内容抽成一个工厂,例如,一个接口可以生产衣服,一个接口可以生产鞋子,那么总的工厂就可以提供两个方法,分别去生产衣服和鞋子;那么A品牌的工厂就可以实现/继承总工厂,并创建自己的对象。

  下面以书桌和书架为例,

    书桌超类为Desk,那么木制书桌为WoodDesk,铁质书桌为IronDesk;

    书架超类为Shelf,木制书架为WoodDesk,铁质书架为IronDesk;

    同时创建一个工厂抽象类,提供了创建书桌和书架的方法,

    木制工厂实现/继承该类,创建的书桌为木制书桌,创建的书架为木制书架

    铁制工厂实现/继承该类,创建的书桌为铁制书桌,创建的书架为铁制书架

public abstract class ProductionFactory {
    public abstract Desk createDesk();
    public abstract Shelf createShelf();
}
public class IronFactory extends ProductionFactory {

    @Override
    public Desk createDesk() {
        return new IronDesk();
    }

    @Override
    public Shelf createShelf() {
        return new IronShelf();
    }
}
public class WoodFactory extends ProductionFactory {

    @Override
    public Desk createDesk() {
        return new WoodDesk();
    }

    @Override
    public Shelf createShelf() {
        return new WoodShelf();
    }
}

  测试

    @Test
    public void factoryTest3(){
        ProductionFactory productionFactory = new IronFactory();
        Desk desk = productionFactory.createDesk();
        desk.printDesk();
        Shelf shelf = productionFactory.createShelf();
        shelf.printShelf();
    }

   最后是三种方式的对比

模式 优缺点
简单工厂 使用一个工厂对象用来生产同一等级结构中的任意产品;不支持拓展增加产品
工厂方法 使用多个工厂对象用来生产同一等级结构中对应的固定产品,支持拓展增加产品
抽象工厂 使用多个工厂对象用来生产不同产品组的产品,不支持拓展产品,支持拓展产品组

 

  

posted @ 2020-08-29 12:31  李聪龙  阅读(215)  评论(0编辑  收藏  举报