工厂模式(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");
}
}