工厂模式
1、描述
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2、使用场景
用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
得到一个类的子类的实例最常用的办法就是直接new一个该对象,但是在某些情况下,用户可能不应该或无法使用这种办法来得到一个子类的实例,其原因是系统不允许用户代码和该类的子类形成耦合或者用户不知道该类有哪些子类可用。
eg:我们设计一个武器系统,其中有AK47冲锋枪和OP96冲锋枪。如果一个士兵想要获得一把枪,他不可能自己去造一把(直接自己new),但是他可以到生成枪的工厂去获取一把。所以再这个场景中,我们就需要用到工厂模式。在这个场景中,枪(Gun)是抽象产品,AK47和OP96是具体产品。枪的工厂(GunFactory)便是构造者,AK47和OP96工厂便是具体的构造者。
3、模式中的角色
抽象产品(Product):抽象类或者接口,负责定义具体产品必须实现的方法。
具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现Product接口的类。
构造者(Creator):一个接口或者抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
具体构造者(ConcreteCreator):如果构造者是抽象类,具体构造者是构造者的子类;如果构造者是接口,具体构造者是实现构造者的类。具体构造者重写工厂方法使该方法返回具体产品的实例。
4、类图
5、代码
package org.sunday.simplefactory;
public interface Gun {
public abstract void shoot();
}
package org.sunday.simplefactory;
public class AK47 implements Gun {
@Override
public void shoot() {
System.out.println("AK47 shoot beng beng beng..............");
}
}
package org.sunday.simplefactory;
public class OP96 implements Gun {
@Override
public void shoot() {
System.out.println("OP96 shoot da da da da..............");
}
}
package org.sunday.simplefactory;
public interface GunFactory {
public abstract Gun createGun();
}
package org.sunday.simplefactory;
public class AK47Factory implements GunFactory {
@Override
public Gun createGun() {
return new AK47();
}
}
package org.sunday.simplefactory;
public class OP96Factory implements GunFactory {
@Override
public Gun createGun() {
return new OP96();
}
}
package org.sunday.simplefactory;
public class Test {
public static void main(String[] args) {
Gun gun = null;
GunFactory gunFactory = null;
//现在我想要一把AC47
gunFactory = new AK47Factory();
gun = gunFactory.createGun();
gun.shoot();
//现在我又想要一把OP96冲锋枪
gunFactory = new OP96Factory();
gun = gunFactory.createGun();
gun.shoot();
}
}
运行结果: