工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
我这里选择生产手机的工厂作为模型对象。
一、分析生产手机的过程,形成要模拟的对象。
1、一部手机要被生产出来,首先要设计,备料,制造,测试,装箱等几步;2、分析手机生产的过程,我们可以知道,备料,制造,测试,装箱是在制造工厂完成,而设计过程一般是在手机公司自己设计;比如,小米公司、苹果公司。
3、到这里,实际上我们可以产生两个对象,一个是手机对象,包括手机的属性和设计过程,另一个是制造手机的工厂对象,包括手机的制造、测试、装箱。
二、根据分析结果,实现两个对象
1、工厂对象
工厂对象负责生产手机,因为一个工厂可以生产多种手机,所以,工厂对象里面可以分为两部分,一部分是相同同的生产部分,一部分是不同的生产部分;
同时,我们会有不同的工厂来生产手机,所以,我们把工厂方法抽象,让具体的工厂子类去继承;
/**
* 工厂抽象类,方便于统一管理,标准生产
* zhuyuehao
* 2018/3/7下午2:31
*/
public abstract class AbstractPhotoFactory {
//相同的部分,公共的逻辑
public final Photo orderPhoto(String type){
Photo photo;
//实例化要生产的手机
photo = createPhoto(type);
if(photo==null){
System.out.println("不能生产该手机!");
System.out.println("-----------------------------------end");
return null;
}
photo.prepare();
photo.make();
photo.test();
photo.box();
System.out.println("-----------------------------------end");
return photo;
}
//不同的部分,生产不同手机
/**
* 生产手机
* @return Photo
*/
public abstract Photo createPhoto(String type);
}
/**
* 富士康工厂
* zhuyuehao
* 2018/3/8上午11:24
*/
public class FoxconnFactory extends AbstractPhotoFactory {
public Photo createPhoto(String type) {
if("小米".equals(type)){
return new XiaoMiPhoto();
}else if ("华为".equals(type)){
return new HuaWeiPhoto();
}else if ("苹果".equals(type)){
return new ApplePhoto();
}else return null;
}
}
/**
* 伟创力工厂
* zhuyuehao
* 2018/3/8上午11:24
*/
public class FlextronicsFactory extends AbstractPhotoFactory {
public Photo createPhoto(String type) {
if("小米".equals(type)){
return new XiaoMiPhoto();
}else if ("华为".equals(type)){
return new HuaWeiPhoto();
}else return null;
}
}
2、手机对象
我们需要生产小米、华为、苹果三款手机,我们可以定义三个手机对象,当然,因为手机对象有很多相同之处,所以,我们也可以用一个抽象的类作为父类;
/**
* 手机的抽象类,父类
* 包括手机的属性,及生产手机的过程
* zhuyuehao
* 2018/3/7上午9:42
*/
public abstract class Photo {
/**
* 手机颜色
*/
private String color;
/**
* 屏幕尺寸
*/
private String screenSize;
/**
* 牌子名称
*/
private String sign;
ArrayList toppings = new ArrayList();
/**
* 准备流程,物料准备
*/
public void prepare(){
System.out.println("Preparing:" + sign);
System.out.println("Adding color:" + color);
System.out.println("Adding screenSize:" + screenSize);
/**
* 子类扩展流程
*/
for(int i=0;i<toppings.size();i++){
System.out.println("Adding specific:" + toppings.get(i));
}
}
/**
* 制造
*/
public void make(){
System.out.println("Making...");
}
/**
* 测试
*/
public void test(){
System.out.println("Testing...");
}
/**
* 装箱
*/
public void box(){
System.out.println("Place photo in official photo box");
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getScreenSize() {
return screenSize;
}
public void setScreenSize(String screenSize) {
this.screenSize = screenSize;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
@Override
public String toString() {
return "Photo{" +
"color='" + color + '\'' +
", screenSize='" + screenSize + '\'' +
", sign='" + sign + '\'' +
'}';
}
}
/**
* zhuyuehao
* 2018/3/8上午11:01
*/
public class XiaoMiPhoto extends Photo {
public XiaoMiPhoto() {
setColor("black");
setScreenSize("5.0");
setSign("小米5");
toppings.add("电池");
}
@Override
public void test() {
System.out.println("Test500 hours");
}
}
/**
* zhuyuehao
* 2018/3/8上午11:20
*/
public class HuaWeiPhoto extends Photo {
public HuaWeiPhoto() {
setColor("yellow");
setScreenSize("5.12");
setSign("华为P10");
}
}
/**
* zhuyuehao
* 2018/3/8上午11:20
*/
public class ApplePhoto extends Photo {
public ApplePhoto() {
setColor("white");
setScreenSize("4.7");
setSign("iphone X");
toppings.add("Add IOS");
}
}
三、测试
public class AbsFactoryTest {
public static void main(String[] args) {
//实例化一个富士康工厂
AbstractPhotoFactory foxconnFactory = new FoxconnFactory();
foxconnFactory.orderPhoto("小米");
//富士康工厂生产苹果手机
foxconnFactory.orderPhoto("苹果");
//富士康工厂生产华为手机
foxconnFactory.orderPhoto("华为");
//实例化一个伟创力工厂
AbstractPhotoFactory flextronicsFactory = new FlextronicsFactory();
flextronicsFactory.orderPhoto("小米");
//伟创力工厂生产苹果手机
flextronicsFactory.orderPhoto("苹果");
//伟创力工厂生产华为手机
flextronicsFactory.orderPhoto("华为");
}
}
运行结果:
Preparing:小米5
Adding color:black
Adding screenSize:5.0
Adding specific:电池
Making...
Test500 hours
Place photo in official photo box
-----------------------------------end
Preparing:iphone X
Adding color:white
Adding screenSize:4.7
Adding specific:Add IOS
Making...
Testing...
Place photo in official photo box
-----------------------------------end
Preparing:华为P10
Adding color:yellow
Adding screenSize:5.12
Making...
Testing...
Place photo in official photo box
-----------------------------------end
Preparing:小米5
Adding color:black
Adding screenSize:5.0
Adding specific:电池
Making...
Test500 hours
Place photo in official photo box
-----------------------------------end
不能生产该手机!
-----------------------------------end
Preparing:华为P10
Adding color:yellow
Adding screenSize:5.12
Making...
Testing...
Place photo in official photo box
-----------------------------------end
四、总结
上面是对抽象工厂模式的简单实现,通过抽象工厂,我们不需要知道工厂内部是如何做的,就可以得到我们想要的产品;
同时,通过抽象类的应用,当有新的工厂和新的手机时,可以很方便的扩展。