工厂模式
一、解决了什么问题?
可批量生产、达到标注化。解决用户和产品之间的关系。对于调用者来说不关心产生的具体逻辑,只关心结果;而对于工厂来说,保证我们产生出来的结果是符合国际化标准的。工厂模式:只对结果负责,确保产品的标准化。
二、工厂模式演变过程,及代码实现demo
文章图片
三、源-简单工厂 Car.java
package com.demo.gc;
/**
* @ather: lucksheep* @date: 2018/8/6 16:27* @description: 定义标准(类)*/public interface Car {/*** 获取一个标准的产品* @return*/String getCarName();
}
BmCar.java
package com.demo.gc;
/*** @ather: lucksheep* @date: 2018/8/6 16:41* @description:*/public class BmCar implements Car {@Overridepublic StringgetCarName() {return "宝马";
}}
BcCar .java
package com.demo.gc;
/*** @ather: lucksheep* @date: 2018/8/6 16:30* @description:*/public class BcCar implements Car {@Overridepublic String getCarName() {return "奔驰";
}}
SimpleFactory.java
package com.demo.gc.simple;
import com.demo.gc.BcCar;
import com.demo.gc.BmCar;
/*** @ather: lucksheep* @date: 2018/8/6 16:33* @description:*/public class SimpleFactory {publicString getCarName(String type){
if("BC".equals(type)){
return new BcCar().getCarName();
}else if("BM".equals(type)){
return new BmCar().getCarName();
}else {
return "未找到该汽车生成的工厂,无法产出该汽车";
}}
}
【工厂模式】Test.java
package com.demo.gc.simple;
/*** @ather: lucksheep* @date: 2018/8/6 16:08* @description: 简单工厂模式*/public class Test {public static void main(String[] args) {//用户本身不关心生产的过程,而只需要关心最后的结果//得到一个工厂SimpleFactory simpleFactory=new SimpleFactory();
System.out.println(simpleFactory.getCarName("BC"));
System.out.println(simpleFactory.getCarName("BM"));
System.out.println(simpleFactory.getCarName("DC"));
}}
总结一:
- 优点
- 通过一个含参的工厂方法,我们可以实例化任何产品类;
- 缺点
- 当我们的子类比较多的情况下,SimpleFactory里面的代码会非常的多;
- 遵循开闭原则的情况下,不能扩展(简直难受);
package com.demo.gc.func;
import com.demo.gc.Car;
/**
* @ather: lucksheep
* @date: 2018/8/6 16:47
* @description: 工厂方法模式
*/
public interface Factory {//工厂必定会有一个生产的功能
Car getCarName();
}
BcCarFactory.java
package com.demo.gc.func;
import com.demo.gc.BcCar;
import com.demo.gc.Car;
/**
* @ather: lucksheep
* @date: 2018/8/6 16:57
* @description:
*/
public class BcCarFactory implements Factory {@Override
public Car getCarName() {
return new BcCar();
}
}
BmCarFactory.java
package com.demo.gc.func;
import com.demo.gc.BmCar;
import com.demo.gc.Car;
/**
* @ather: lucksheep
* @date: 2018/8/6 16:57
* @description:
*/
public class BmCarFactory implements Factory {@Override
public Car getCarName() {
return new BmCar();
}}
Test.java
package com.demo.gc.func;
/**
* @ather: lucksheep
* @date: 2018/8/6 16:48
* @description: 工厂模式
*/
public class Test {public static void main(String[] args) {Factory factory=new BmCarFactory();
System.out.println(factory.getCarName().getCarName());
}
}
总结二:
- 优点
- 工厂方法模式减轻了工厂类的负担;
- 方便扩展,使工厂类遵循开放-开闭原则;
- 缺点
- 相比简单工厂,实现稍微复杂点,处理起来也复杂了很多;
package com.demo.gc.abstr;
import com.demo.gc.BcCar;
import com.demo.gc.BmCar;
import com.demo.gc.Car;
/**
* @ather: zhouyang
* @date: 2018/8/6 17:05
* @description:
*/
public class CarFactory extends AbstractFactory {@Override
public Car getBmCar() {
return new BmCar();
}@Override
public Car getBcCar() {
return new BcCar();
}
}
AbstractFactory.java
package com.demo.gc.abstr;
import com.demo.gc.Car;
/**
* @ather: zhouyang
* @date: 2018/8/6 17:00
* @description: 抽项工厂模式
*/
public abstract class AbstractFactory {//方便于统一的管理
//与接口的区别,不仅仅只有接口的功能,还有抽象的逻辑;接口只是一接口/**
* 获取bmCar
* @return
*/
public abstract Car getBmCar();
/**
* 获取bcCar
* @return
*/
public abstract Car getBcCar();
}
Test.java
package com.demo.gc.abstr;
/**
* @ather: lucksheep
* @date: 2018/8/6 17:04
* @description:
*/
public class Test {public static void main(String[] args) {CarFactory factory=new CarFactory();
System.out.println(factory.getBcCar().getCarName());
System.out.println(factory.getBmCar().getCarName());
}
}
六:区别
- 简单工厂:在同级结构里面可生产任意产品,在遵循开闭原则的情况下,不支持扩展
- 工厂方法:在同级结构里面只能生产固定的产品,在遵循开闭原则的情况下,支持拓展
- 抽象工厂:用来产出所有产品
推荐阅读
- 一个人的旅行,三亚
- 一个小故事,我的思考。
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 开学第一天(下)
- 一个人的碎碎念
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 第326天
- Y房东的后半生14
- 奔向你的城市