设计模式系列-工厂模式
积千里跬步,汇万里江河.每天进步一点点,终有一天将成大佬
前言
工厂模式有一下三种
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
其中简单工厂模式不在23中模式之中,更多的是一种编程习惯,而我们平常所说的工厂模式一般指的是工厂方法模式,抽象工厂在实际的业务开发中也用的比较少,因为它有时候违背了开闭原则.由于篇幅有限,抽象工厂本文就不讲了,以后单独讲;
简单工厂模式
简单工厂到底有多简单呢?简单到只有一个工厂,这个工厂相当于是万能工厂,你想要什么,只要和它说一声,它就会想方设法的去抱你创建,然后给你;举个买车的简单的例子:
当我要买车的时候,我选了这两种车.
/**
* 创建一个汽车接口
* */
public interface Car {
/**
* 汽车能动
* */
void run();
}
/**
* 奔驰车
* */
public class Benz implements Car {
@Override
public void run() {
System.out.println("大奔开动了");
}
}
/**
* 五菱神车
* */
public class Wuling implements Car {
@Override
public void run() {
System.out.println("五菱神车开动了");
}
}
选是选好了,可是要怎么得到呢?是不是下意识的new一个出来?
//我要奔驰车
Benz myCar=new Benz();
如果是这样的话,就相当于自己亲手造了一辆奔驰车出来,因为是你自己new出来的嘛!!!!!
这种事情当然是交给工厂去做嘛,叫工厂去new就可以了,我只要交钱给工厂就可以了.诶,有钱真好!
/**
* 汽车工厂
*
* 静态工厂
*
* 简单工厂
* */
public class CarFactory {
public static Car getCar(String type){
if("我要五菱神车".equals(type)){
return new Wuling();
}
if ("我要大奔驰".equals(type)){
return new Benz();
}
return null;
}
}
找到了这个工厂之后,我只要直接告诉它我要什么车就可以了,工厂就会帮我造好给我;
/**
* 买车
* */
public class CostumerMain {
public static void main(String[] args) {
//跟车厂说一声我要五菱神车
Car wuling=CarFactory.getCar("我要五菱神车");
//跟车厂说一声我要大奔驰
Car Benz=CarFactory.getCar("我要大奔驰");
//开着五菱神车去兜兜风
wuling.run();
//开着大奔去兜兜风
Benz.run();
}
}
//五菱神车开动了
//大奔开动了
这样子,买车就结束了,果然钱可以解决一切,哈哈,开个玩笑~
工厂方法模式
上次买了两辆车之后,白天开着大奔去街上撩妹,晚上开着五菱神车去秋名山飙车,从此走向了人生巅峰.可是好景不长,大奔开着开着就漏油了,五菱神车终于也翻车了.
找到了上次买车的工厂,准备换个低调点的劳斯莱斯.可是那家工厂竟然告诉我说他们那边还没有造过劳斯莱斯,需要改造一下工厂,然后才能生产劳斯莱斯,叫我等他们改造好之后再来买.听他们这麽说后,我心想,我这分分钟几百万上下的人,时间就是金钱.我可等不了.
于是几番寻找之后,发现英国有个劳斯莱斯车场,专门来生产劳斯莱斯.于是和接待我的中介小姐姐聊了一下,发现他们的生产模式是这样的:
/**
* 他们有个汽车工厂总部,用来定义车厂该干什么
* */
public interface AllCarFactory {
/**
* 生产汽车
*/
Car getCar();
}
/**
* 有个汽车规则,用来定义汽车能干什么
*/
public interface Car {
/**
* 汽车能跑
*/
void run();
}
/**
* 劳斯莱斯汽车
* */
public class RollsRoyce implements Car {
/**
* 劳斯莱斯能跑起来
*/
@Override
public void run() {
System.out.println("劳斯莱斯开起来了!!");
}
}
/**
* 劳斯莱斯汽车工厂
* */
public class RollsRoyceFactory implements AllCarFactory {
/**
* 生产一辆劳斯莱斯
*/
@Override
public Car getCar() {
return new RollsRoyce();
}
}
找到车厂后,我毫不犹豫和接待我的小姐姐说给我来一辆,小姐姐见我这么豪爽,准备再忽悠我买几辆车,不推荐我几辆车....她知道我之前买了奔驰和五菱神车,和我说他们这边还有还有五菱车厂和奔驰车厂,都是专门用来造同一种车的.于是我就去参观了一下:
/**
* 五菱神车
*/
public class Wuling implements Car {
/**
* 五菱神车能飙车
*/
@Override
public void run() {
System.out.println("五菱神车开动了");
}
}
/**
* 五菱神车工厂
* */
public class WulingFactory implements AllCarFactory {
/**
* 生产一辆五菱神车
*/
@Override
public Car getCar() {
return new Wuling();
}
}
再区看看奔驰车厂:
/**
* 奔驰汽车
*/
public class Benz implements Car {
/**
* 奔驰汽车能跑
*/
@Override
public void run() {
System.out.println("大奔开动了");
}
}
/**
* 奔驰汽车工厂
* */
public class BenzFactory implements AllCarFactory {
/**
* 生产一辆奔驰汽车
*/
@Override
public Car getCar() {
return new Benz();
}
}
看完之后,感觉还可以,于是分别到三个工厂买了三辆车,然后高高兴兴的回家了:
看看我买车的过程:
/**
* 土豪买车记
* */
public class CostumerMain {
public static void main(String[] args) {
//去五菱车厂买车
Car wuling=new WulingFactory().getCar();
//去奔驰车厂买车
Car benz=new BenzFactory().getCar();
//去劳斯莱斯车厂买车
Car rollsRoyce=new RollsRoyceFactory().getCar();
//开着三辆车去兜兜风
wuling.run();
benz.run();
rollsRoyce.run();
}
}
//五菱神车开动了
//大奔开动了
//劳斯莱斯开起来了!!
总结
买完车后,小姐姐还和我说他们这样的模式生产车的话有好多好处,比如一个车厂只要负责一种车的生产和售后,这样的话,生产效率就会比较高,赚的钱自然也多,同时每个车厂还可以举行不同活动,来吸引消费者,同时,你如果哪个品牌的车出现了问题了,直接去那辆车的工厂,基本上都能帮你解决问题,毕竟<font color=orange>术业有专攻</font>,对比前一个工厂什么都造的万金油来说,深入一项技术比什么技术都懂好;
不过有时候,万金油工厂也挺好的,就是一站式服务,你要什么它都有,不用到处乱跑,省心省力.所以还是要根据什么行业来执行什么模式,这样才能利益最大化;