简单工厂模式:当同一类事物存在不同种实例且后续仍可能扩展时,可以事先定义这类事物的工厂,根据实际情况返回对象
/**
* 武器接口
* */
public interface Weapon {
public void shoot();
}
/**
* AK47
* */
public class AK47 implements Weapon{
public void shoot(){
System.out.println("AK47dadada");
}
}
/**
* M4A1
* */
public class M4A1 implements Weapon{
public void shoot(){
System.out.println("M4A1dadada");
}
}
/**
* 武器工厂
* 当有新的武器加进来时,仍需要改动武器工厂代码
* */
public class WeaponFactory {
public static Weapon createAK47(){
return new AK47();
}
public static Weapon createM4A1(){
return new M4A1();
}
}
工厂方法模式:对简单工厂模式优化,使得扩展时不再需要修改代码,只需要实现武器工厂接口即可
/**
* 武器工厂接口,新武器加进来时直接实现其接口
* */
public interface WeaponFactory {
public Weapon create();
}
/**
* M4A1工厂
* */
public class M4A1WeaponFactory implements WeaponFactory{
@Override
public Weapon create() {
return new M4A1();
}
}
/**
* AK47工厂
* */
public class AK47WeaponFactory implements WeaponFactory {
@Override
public Weapon create() {
return new AK47();
}
}
抽象工厂模式:当多种事物组成的产品族存在多个时,可以通过抽象工厂实现不同产品族的对象创建,可以理解成工厂方法模式的横向扩展
/**
* 子弹
* */
public interface Bullet {
//获取子弹口径
public void getCaliber();
}
/**
* 5.56毫米口径子弹
* */
public class Bullet556 implements Bullet{
@Override
public void getCaliber() {
System.out.println("5.56");
}
}
/**
* 7.62毫米口径子弹
* */
public class Bullet762 implements Bullet{
@Override
public void getCaliber() {
System.out.println("7.62");
}
}
/**
* 子弹工厂
* */
public interface BulletFactory {
public Bullet create();
}
/**
* 5.56毫米口径子弹工厂
* */
public class Bullet556Factory implements BulletFactory{
@Override
public Bullet create() {
return new Bullet556();
}
}
/**
* 7.62毫米口径子弹工厂
* */
public class Bullet762Factory implements BulletFactory{
@Override
public Bullet create() {
return new Bullet762();
}
}
/**
* 流水线工厂,每个流水线生产枪支和对应口径的子弹
* */
public abstract class AssemblyLineFactory {
//创建武器
public abstract Weapon createWeapon();
//创建子弹
public abstract Bullet createBullet();
}
/**
* AK47流水线工厂,生产AK47和7.62毫米口径的子弹
* */
public class AK47AssemblyLineFactory extends AssemblyLineFactory{
@Override
public Weapon createWeapon() {
return new AK47WeaponFactory().create();
}
@Override
public Bullet createBullet() {
return new Bullet762Factory().create();
}
}
/**
* M4A1流水线工厂,生产M4A1和5.56毫米口径的子弹
* */
public class M4A1AssemblyLineFactory extends AssemblyLineFactory{
@Override
public Weapon createWeapon() {
return new M4A1WeaponFactory().create();
}
@Override
public Bullet createBullet() {
return new Bullet556Factory().create();
}
}
说明:后续添加新流水线工厂直接继承抽象类AssemblyLineFactory即可,这里之所以用抽象类,是因为单继承多实现。流水线工厂的子类应该只是负责生产流水线上的产品。