【简单工厂模式】
在介绍工厂方法模式之前,先来认识一下简单工厂模式。它是属于创建型模式,但不属于23种设计模式之一。主要是因为其不符合6大设计原则中的总原则 - 开闭原则:就是说对扩展开放,对修改关闭。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
- 优点:比较好理解,简单易操作
- 缺点:违反了设计模式的开闭原则,即对扩展开放,对修改关闭。当我们需要增加一个类型时,都需要修改工厂类
```java
/**
- 球类 */ public interface Ball { void play(); }
```java/*** 篮球*/public class BasketBall implements Ball {@Overridepublic void play() {System.out.println("打篮球");}}
/*** 足球*/public class FootBall implements Ball {@Overridepublic void play() {System.out.println("踢足球");}}
/*** 球类工厂类*/public class BallFactory {public static Ball createBall(String type) {if ("football".equals(type)) {return new FootBall();} else if ("basketball".equals(type)) {return new BasketBall();} else {return null;}}}
public class SimpleFactoryTest {public static void main(String[] args) {Ball footBall = BallFactory.createBall("football");footBall.play();Ball basketball = BallFactory.createBall("basketball");basketball.play();}}-----输出----踢足球打篮球
【工厂方法模式】
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
- 优点:
- 降低了代码耦合度,对象的生成交给子类去完成
- 实现了开放封闭原则 - 每次添加子产品 不需要修改原有代码
缺点:
- 增加了代码量,每个具体产品都需要一个具体工厂
当增加抽象产品,也就是添加一个其他产品族,需要修改工厂,违背OCP(开闭原则)
/*** 生产球类的工厂接口*/public interface BallFactory {Ball createBall();}
/*** 篮球工厂类*/public class BasketBallFactory implements BallFactory {@Overridepublic Ball createBall() {return new BasketBall();}}
/** * 足球工厂类 */ public class FootBallFactory implements BallFactory { @Override public Ball createBall() { return new FootBall(); } }public class FactoryMethodTest { public static void main(String[] args) { // 足球工厂 FootBallFactory footBallFactory = new FootBallFactory(); Ball footBall = footBallFactory.createBall(); footBall.play(); // 篮球工厂 BasketBallFactory basketBallFactory = new BasketBallFactory(); Ball basketBall = basketBallFactory.createBall(); basketBall.play(); } } -----输出---- 踢足球 打篮球
