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

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

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();



    }
}

测试结果:

四 工厂方法模式的优缺点

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

经验分享 程序员 微信小程序 职场和发展