二十三种设计模式(二,三)工厂模式(工厂方法模式与抽象工厂模式)

简单工厂模式:当同一类事物存在不同种实例且后续仍可能扩展时,可以事先定义这类事物的工厂,根据实际情况返回对象

/**

* 武器接口

* */

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即可,这里之所以用抽象类,是因为单继承多实现。流水线工厂的子类应该只是负责生产流水线上的产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值