工厂模式

  • 简单工厂
    隐藏new对象的过程,类似于手工作坊,可以生产不同的产品(对象)
/**
 * @author haowq 2021/4/25 10:06
 * 简单工厂,扩展性不好,扩展违反开闭原则
 */
public class SimpleFactory {
    public Car createCar(){
        return  new Car();
    }
    public Plane createPlane(){
        return new Plane();
    }
    //other create operator
}
  • 工厂方法
    相比于简单工厂可以生产各种产品,工厂方法值生产一种产品,相当于家庭作坊向流水线转型
/**
 * @author haowq 2021/4/27 9:53
 * 一个工厂对应一种产品,用户只用知道 工厂名称
 * 相比于简单工厂模式,满足开闭原则,扩展工厂只需要继承工厂接口,不需要修改原有代码
 */
public interface MethodFactory {
    Animal newAnimal();
}
/**
*马工厂
*/
public class HorseFactory implements MethodFactory {
    @Override
    public Animal newAnimal() {
        return new Horse();
    }
}
/**
*牛工厂
*/
public class CowFactory implements MethodFactory{
    @Override
    public Animal newAnimal() {
        return  new Cow();
    }
}

  • 抽象工厂
    抽象工厂相比于工厂方法,生产的产品更加多样化,类似于代工厂,可以有多条流水线,生产不同的商品
/**
 * @author haowq 2021/4/27 10:01
 * 抽象工厂,有产品族的概念,两个维度,工厂维度和产品维度,
 * 工程维度上方便扩展,产品维度扩展的话违反开闭原则
 */
public interface AbstractFactroy {
    Tank newTank();
    Bullet newBullet();
}
/**
 * Good 工厂
 */
public class GoodAbastractFactory implements AbstractFactroy {
    @Override
    public Tank newTank() {
        return new GoodTank();
    }
    @Override
    public Bullet newBullet() {
        return new GoodBullet();
    }
}
/**
 * Bad 工厂
 */
public class BadAbastractFactory implements AbstractFactroy {
    @Override
    public Tank newTank() {
        return new BadTank();
    }
    @Override
    public Bullet newBullet() {
        return new BadBullet();
    }
}
  • 既然抽象工厂在产品维度拓展存在问题,有没有解决方法呢?或者说在这种情况下,有没有其他更加合适的设计模式?

你可能感兴趣的:(工厂模式)