<big>版权声明:本文为 Codeagles 原创文章,可以随意转载,但必须在明确位置注明出处!!!</big>
工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。看到这个名字不难想象到我们要做什么,当然就是创造工厂,那么工厂是干什么的?当然是生产创造用的了,生产什么呢?JAVA中一切万物皆对象,工厂用来生产对象。
工厂模式通常分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
想要用工厂模式,那就要知道这么几个问题:
- 为什么要用
- 有什么好处
- 有什么坏处
- 怎么用
OK,其他的细枝末节先不深入,先搞懂这几个问题就好了,深入的随着理解和实践,认知也会越来越深入的。
首先,为什么要用?
我们知道设计模式无疑就是通过经验来总结出比较合理的代码结构,目的也很明确,挂在嘴边的高内聚、低耦合,设计模式为了解耦,代码更合理。
有什么好处呢?
- 扩展性高
- 让调用者只用接口,而不去注重内部实现
- 当然最好的就是,调用者只需要知道对象名字就可以,不需要关注怎么创建。(创建由子类进行)
有什么坏处呢?
相对也是显而易见的,每次增加一个需求或者说产品,都要对应增加一个对象工厂以及实例类,如果系统很大,那么类个数是巨多的,无疑维护成本提升了。
那么,最后一个问题怎么用?
Talk is cheap, show me the code.
简单工厂
package design;
//抽象机器
abstract class Mechine {
public abstract void move();
public abstract void stop();
}
// 抽象机器实例——汽车
class Car extends Mechine {
@Override
public void move() {
System.out.println("汽车正以80迈速度驶过来。。。");
}
@Override
public void stop() {
System.out.println("一脚急刹车,滑行20米停下来了。。");
}
}
// 抽象机器实例——飞机
class Airplane extends Mechine {
@Override
public void move() {
System.out.println("飞机正在起飞。。。");
}
@Override
public void stop() {
System.out.println("飞机准备降落。。。");
}
}
//简单工厂
public class MechineFactory {
public static Mechine createMechine(String mechineName) {
Mechine mechine = null;
if(mechineName.equals("car")){
mechine= new Car();
}
if(mechineName.equals("airplane")){
mechine= new Airplane();
}
return mechine;
}
}
public class Boss {
public static void main(String[] args) {
// Boss下令“我要造一辆轿车,现在马上!会动的!”
// 机器工厂接到指令,立即开始做ing。。。
Mechine mechine = MechineFactory.createMechine("car");
mechine.move();
//Boss:"我好几个亿的生产线不能这么放着,造一辆飞机,会飞会降落的"
mechine = MechineFactory.createMechine("airplane");
mechine.move();
mechine.stop();
}
}
这就是简单工厂,那么工厂方法模式,其实是简单工厂的扩展,说白了就是简单工厂抽象化。
工厂方法模式
package design;
//抽象机器
abstract class Mechine {
public abstract void move();
public abstract void stop();
}
// 抽象机器实例——汽车
class Car extends Mechine {
@Override
public void move() {
System.out.println("汽车正以80迈速度驶过来。。。");
}
@Override
public void stop() {
System.out.println("一脚急刹车,滑行20米停下来了。。");
}
}
// 抽象机器实例——飞机
class Airplane extends Mechine {
@Override
public void move() {
System.out.println("飞机正在起飞。。。");
}
@Override
public void stop() {
System.out.println("飞机准备降落。。。");
}
}
//简单工厂抽象化
abstract class MechineFactory {
public abstract Mechine createMechine(String mechineName);
}
//汽车工厂--只负责创建汽车
public class CarFactory extends MechineFactory{
@Override
public Mechine createMechine(String mechineName) {
return new Car();
}
}
public class Boss {
public static void main(String[] args) {
// Boss下令“我要造一辆轿车,现在马上!会动的!”
// 机器工厂接到指令,立即开始做
MechineFactory mf = new CarFactory();
Mechine m=mf.createMechine("car");
m.move();
}
}
show完code是不是有点概念了,当然模式只是模式,还有很多种写法,只要是这种思想就可以,比如还可用接口implement来写,那样更好理解,这里给出这种写法,也是自己想锻炼一下。
总结
这里只讲了前两种,至于抽象工厂,后续更新。简单工厂和工厂方法区别在于,一个用工厂创建对象,一个用工厂创建单一产品工厂在创建对象。