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