工厂模式——简单工厂模式和工厂方法模式
工厂模式——简单工厂模式和工厂方法模式
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(); } }
测试结果:
四 工厂方法模式的优缺点
优点:符合开闭原则。将创建对象的任务交给工厂类去实现,客户端不用关心具体的实现细节,只需要调用工厂类提供的方法即可创建对象。 缺点:如果要添加一个具体产品,就需要添加一个具体类和一个生产具体产品的工厂,增大了类的数量,代码的复杂程度提高。
下一篇:
两种单例模式与封装性