学好Java设计模式--工厂模式

一篇文章读懂工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。如果创建某个对象的过程很复杂,并且在很多地方都需要用到,那么使用工厂模式就能减少很多重复代码。并且将对象的创建和使用分开,在一定程度上起到了解耦的作用。

工厂模式的分类

  • 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。

  • 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式;

  • 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。

简单工厂模式

严格来说,简单工厂模式并不是23种常用设计模式之一,它只能算工厂模式家族中的一种简单实现。简单工厂模式包括以下三种角色:

  • 工厂角色:简单工厂模式的核心,负责实现所有创建对象过程的内部逻辑。
  • 抽象产品角色:简单工厂模式所创建的所有对象的公共接口。
  • 具体产品角色:简单工厂模式的创建目标,所有具体产品角色都实现了抽象产品角色接口。

简单工厂模式示例

工厂角色

package com.rul.designpattern.factory.simplefactory;

/**
 * 工厂角色
 *
 * @author LuoRu
 */
public class AnimalFactory {

    public static Animal createAnimal(String animalType) {
        if (animalType == null) {
            return null;
        }
        if (animalType.equalsIgnoreCase("SHEEP")) {
            return new Sheep();
        } else if (animalType.equalsIgnoreCase("BIRD")) {
            return new Bird();
        } else if (animalType.equalsIgnoreCase("CAT")) {
            return new Cat();
        }
        return null;
    }
}

抽象产品角色

package com.rul.designpattern.factory.simplefactory;

/**
 * 抽象产品角色
 *
 * @author LuoRu
 */
public interface Animal {
    void sound();
}

具体产品角色

package com.rul.designpattern.factory.simplefactory;

/**
 * 具体产品角色
 *
 * @author LuoRu
 */
public class Bird implements Animal {

    public Bird() {
        System.out.println("new Bird");
    }

    @Override
    public void sound() {
        System.out.println("chirp~~~");
    }
}
package com.rul.designpattern.factory.simplefactory;

/**
 * 具体产品角色
 *
 * @author LuoRu
 */
public class Cat implements Animal {

    public Cat() {
        System.out.println("new Cat");
    }

    @Override
    public void sound() {
        System.out.println("mew~~~");
    }
}
package com.rul.designpattern.factory.simplefactory;

/**
 * 具体产品角色
 *
 * @author LuoRu
 */
public class Sheep implements Animal {

    public Sheep() {
        System.out.println("new Sheep");
    }

    @Override
    public void sound() {
        System.out.println("baa~~~");
    }
}

工厂方法模式

工厂方法模式是工厂模式家族中使用最对的模式。在工厂方法模式中,我们不再将所用对象的创建都由同一个工厂类负责。而是不同的工厂负责不同对象的创建,而不同的工厂实现公共的接口。工厂方法模式包括以下四种角色:

  • 抽象工厂角色:所有创建对象的工厂类的公共接口。
  • 具体工厂角色:所有具体工厂角色都实现了抽象工厂角色接口,每个具体工厂角色负责一种对象的创建。
  • 抽象产品角色:工厂方法模式所创建的所有对象的公共接口。
  • 具体产品角色:工厂方法模式的创建目标,所有具体产品角色都实现了抽象产品角色接口。某种具体产品由专门的具体工厂创建。

工厂方法模式示例

抽象工厂角色

package com.rul.designpattern.factory.factorymethod;

/**
 * 抽象工厂角色
 *
 * @author LuoRu
 */
public interface AnimalFactory {
    Animal create();
}

具体工厂角色

package com.rul.designpattern.factory.factorymethod;

/**
 * 具体工厂角色
 *
 * @author LuoRu
 */
public class BirdFactory implements AnimalFactory {
    @Override
    public Animal create() {
        return new Bird();
    }
}

抽象产品角色

package com.rul.designpattern.factory.factorymethod;

/**
 * 抽象产品角色
 *
 * @author LuoRu
 */
public interface Animal {
    void sound();
}

具体产品角色

package com.rul.designpattern.factory.factorymethod;

/**
 * 具体产品角色
 *
 * @author LuoRu
 */
public class Bird implements Animal {

    public Bird() {
        System.out.println("new Bird");
    }

    @Override
    public void sound() {
        System.out.println("chirp~~~");
    }
}

抽象工厂模式

在工厂方法模式中,我们生产的都是同一类产品,抽象工厂模式中的工厂类则不止可以创建一种产品,而是可以创建一组产品。抽象工厂模式包括以下四种角色:

  • 抽象工厂角色:所有创建同一组对象的工厂类的公共接口。
  • 具体工厂角色:所有具体工厂角色都实现了抽象工厂角色接口,每个具体工厂角色负责一组对象的创建。
  • 抽象产品角色:抽象工厂模式所创建的同一类(区别“同一组”)对象的公共接口。
  • 具体产品角色:抽象工厂模式的创建目标,所有具体产品角色都实现了某个抽象产品角色接口。在抽象工厂中创建的产品属于同一产品族。

抽象工厂模式示例

抽象工厂角色

package com.rul.designpattern.factory.abstractfactory;

/**
 * 抽象工厂角色
 * 兵器工厂接口
 *
 * @author LuoRu
 */
public interface WeaponsFactory {
    Gun createGun();

    Bullet createBullet();
}

具体工厂角色

package com.rul.designpattern.factory.abstractfactory;

/**
 * 具体工厂角色
 * AK工厂类
 *
 * @author LuoRu
 */
public class AKFactory implements WeaponsFactory {
    @Override
    public Gun createGun() {
        return new AKGun();
    }

    @Override
    public Bullet createBullet() {
        return new AKBullet();
    }
}
package com.rul.designpattern.factory.abstractfactory;

/**
 * 具体工厂角色
 * AK工厂类
 *
 * @author LuoRu
 */
public class M416Factory implements WeaponsFactory {
    @Override
    public Gun createGun() {
        return new M416Gun();
    }

    @Override
    public Bullet createBullet() {
        return new M416Bullet();
    }
}

抽象产品角色

package com.rul.designpattern.factory.abstractfactory;

/**
 * 抽象产品角色
 * 枪械接口
 *
 * @author LuoRu
 */
public interface Gun {
    void shoot();
}
package com.rul.designpattern.factory.abstractfactory;

/**
 * 抽象产品角色
 * 子弹接口
 *
 * @author LuoRu
 */
public interface Bullet {
    void describe();
}

具体产品角色

package com.rul.designpattern.factory.abstractfactory;

/**
 * 具体产品角色
 * AK枪械类
 *
 * @author LuoRu
 */
public class AKGun implements Gun {
    @Override
    public void shoot() {
        System.out.println("AK shoot...");
    }
}
package com.rul.designpattern.factory.abstractfactory;

/**
 * 具体产品角色
 * M416枪械类
 *
 * @author LuoRu
 */
public class M416Gun implements Gun {
    @Override
    public void shoot() {
        System.out.println("M416 shoot...");
    }
}
package com.rul.designpattern.factory.abstractfactory;

/**
 * 具体产品角色
 * AK子弹类
 *
 * @author LuoRu
 */
public class AKBullet implements Bullet {
    @Override
    public void describe() {
        System.out.println("AK Bullet");
    }
}
package com.rul.designpattern.factory.abstractfactory;

/**
 * 具体产品角色
 * M416子弹类
 *
 * @author LuoRu
 */
public class M416Bullet implements Bullet {
    @Override
    public void describe() {
        System.out.println("M416 Bullet");
    }
}

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