工厂模式——简单工厂模式和工厂方法模式

工厂模式——简单工厂模式和工厂方法模式

1)设计模式:一种可以被重复利用的解决方案。
2)工厂模式属于设计模式的一种。
3)工厂模式解决的问题:对象的创建问题

一 简单工厂模式

简单工厂模式的角色包括三个:抽象产品具体产品工厂类。

	定义一个抽象类,其中有抽象方法,定义几个子类去继承这个抽象类,并重写里面的抽象方法;定义一个工厂类,工厂类中有一个静态方法,根据传入的参数,返回相应的对象

例如:武器Weapon作为一个抽象类,里面有抽象方法attack ,定义几个子类去继承Weapon,并重写attack方法,定义一个WeaponFactory工厂类,工厂类中有一个静态方法get(string weaponType),根据传入的weaponType返回相应的对象
如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试结果:
在这里插入图片描述

二 简单工厂模式的优缺点

优点:将创建对象的任务交给工厂去实现,客户端不用关心具体的细节,只需要调用工厂提供的方法就可以创建对象。
缺点:不符合开闭原则。
开闭原则:对扩展开放,对修改关闭。
在添加具体产品时,不仅要添加具体类,还要修改工厂类。所以违背开闭原则

三 工厂方法模式

工厂方法模式很好的解决了简单工厂模式的缺点,符合开闭原则
核心:每个具体产品都由对应的工厂类创建
工厂方法模式包括四种角色:抽象产品、具体产品、抽象工厂、具体工厂

public abstract class Weapon {
    public abstract  void attack();
}
public class Gun extends Weapon{
    @Override
    public void attack() {
        System.out.println("用枪攻击");
    }
}
public class Tank extends Weapon{
    @Override
    public void attack(){
        System.out.println("用坦克攻击");
    }
}

public abstract class  WeaponFactory {
    public abstract  Weapon get();
}
public class GunFactory extends WeaponFactory{
    @Override
    public Weapon get(){
        return new Gun();
    }
}

public class TankFactory extends WeaponFactory{
    @Override
    public Weapon get(){
        return new Tank();
    }
}

public class Client {

    public static  void main(String[] args){
        /*获取枪生产工厂、让枪工厂去生产产品、让产品去攻击*/
        WeaponFactory factory =new GunFactory();
        Weapon weapon= factory.get();
        weapon.attack();

        /*获取坦克生产工厂、让坦克工厂去生产产品、让产品去攻击*/
        WeaponFactory factory1 =new TankFactory();
        Weapon weapon1= factory1.get();
        weapon1.attack();



    }
}

测试结果:
在这里插入图片描述

四 工厂方法模式的优缺点

优点:符合开闭原则。将创建对象的任务交给工厂类去实现,客户端不用关心具体的实现细节,只需要调用工厂类提供的方法即可创建对象。
缺点:如果要添加一个具体产品,就需要添加一个具体类和一个生产具体产品的工厂,增大了类的数量,代码的复杂程度提高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值