设计模式——工厂模式
工厂模式:一种创建行模式,提供了一种创建具有相同属性或行为的对象的最佳方式。顾名思义工厂生产出来的产品都是标准化的,如果在项目中需要在多处地方创建相同的对象(对对象进行了相同的处理并提供出来),此时可以考虑使用工厂模式!
废话不多说,show code!
1-定义Factory,定义抽象方法
工厂模式,首先需要工厂一般定义成一个接口或者抽象类
package designPattern.test.factory.simple;
/**
* 工厂接口,还不确定生产的产品,定义成泛型接口
* 生产类型为T的产品
*/
public interface Factory<T> {
T create();
}
2-定义产品
工厂的存在就是生产产品的,有了工厂就可以根据具体的项目定义具体的产品了,下面以手机为例介绍工厂模式中的产品
2.1-定义产品的行为
产品生产出来就是供使用的,将产品的行为抽象出来
package designPattern.test.factory.simple.product;
/**
* 手机接口
*/
public interface Phone {
/**
* 手机可以打电话
*/
void call(String name);
/**
* 手机可以发短信
*/
void sendMessage(String name,String message);
}
2.2-定义抽象产品
工厂生产的产品具有一些特定的属性,通常都是标准化的,一般不会改变!
package designPattern.test.factory.simple.product;
import java.io.Serializable;
/**
* 抽象产品
*/
public abstract class BasePhone implements Serializable {
//长度
private double length;
//宽度
private double width;
//厚度
private double thick;
//颜色
private String color;
public BasePhone(){}
public BasePhone(double length, double width, double thick, String color) {
this.length = length;
this.width = width;
this.thick = thick;
this.color = color;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getThick() {
return thick;
}
public void setThick(double thick) {
this.thick = thick;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "BasePhone{" +
"length=" + length +
", width=" + width +
", thick=" + thick +
", color='" + color + '\'' +
'}';
}
}
2.3定义具体产品
具体的产品,定义ApplePhone
package designPattern.test.factory.simple.product;
/**
* Apple手机
*/
public class ApplePhone extends BasePhone implements Phone {
public ApplePhone() {
super();
}
public ApplePhone(double length, double width, double thick, String color) {
super(length,width,thick,color);
}
@Override
public void call(String name) {
System.out.println("使用Apple手机" + this.toString() + "打电话给" + name);
}
@Override
public void sendMessage(String name, String message) {
System.out.println("使用Apple手机" + this.toString() + "发短信给" + name + ",内容为:" + message);
}
}
定义具体产品:HuaWeiPhone
package designPattern.test.factory.simple.product;
/**
* 华为手机
*/
public class HuaWeiPhone extends BasePhone implements Phone {
public HuaWeiPhone() {
super();
}
public HuaWeiPhone(double length, double width, double thick, String color) {
super(length, width, thick, color);
}
@Override
public void call(String name) {
System.out.println("使用HuaWei手机" + this.toString() + "打电话给" + name);
}
@Override
public void sendMessage(String name, String message) {
System.out.println("使用HuaWei手机" + this.toString() + "发短信给" + name + ",内容为:" + message);
}
}
3定义工厂
3-1定义抽象工厂
package designPattern.test.factory.simple.factory;
import designPattern.test.factory.simple.Factory;
import designPattern.test.factory.simple.product.BasePhone;
/**
* 手机工厂
*/
public abstract class PhoneFactory implements Factory<BasePhone> {
/**
* 获取Factory方法
*/
public static Factory getFactory(Class clazz) {
Factory factory = null;
try {
factory = (Factory) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
}
3-2定义具体手机工厂
ApplePhoneFactory
package designPattern.test.factory.simple.factory;
import designPattern.test.factory.simple.product.ApplePhone;
import designPattern.test.factory.simple.product.BasePhone;
/**
* Apple手机工厂
*/
public class ApplePhoneFactory extends PhoneFactory {
/**
* 生产具体的ApplePhone产品,如果需要对ApplePhone进行统一的初始化操作
* 可以都定义在这里,项目中就不需要在重复初始化了
*/
@Override
public BasePhone create() {
return new ApplePhone(155, 88, 9.1, "golden");
}
}
HuaWeiPhoneFactory
package designPattern.test.factory.simple.factory;
import designPattern.test.factory.simple.product.BasePhone;
import designPattern.test.factory.simple.product.HuaWeiPhone;
/**
* 华为手机
*/
public class HuaWeiPhoneFactory extends PhoneFactory {
/**
* 生产具体的HuaWeiPhone产品,如果需要对HuaWeiPhone进行统一的初始化操作
* 可以都定义在这里,项目中就不需要在重复初始化了
*/
@Override
public BasePhone create() {
return new HuaWeiPhone(155, 88, 10.2, "golden");
}
}
4测试
package designPattern.test.factory.simple;
import designPattern.test.factory.simple.factory.ApplePhoneFactory;
import designPattern.test.factory.simple.factory.HuaWeiPhoneFactory;
import designPattern.test.factory.simple.factory.PhoneFactory;
import designPattern.test.factory.simple.product.Phone;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
/**
* 工厂模式测试
*/
public class FactoryTest {
private static final String APPLEPHONE = "applePhone";
private static final String HUAWEIPHONE = "huaweiPhone";
/**
* 工厂集合
*/
private static Map<String, Factory> factoryMap = new HashMap<>();
/**
* 初始化工厂放入集合中
*/
static {
Factory applePhoneFactory = PhoneFactory.getFactory(ApplePhoneFactory.class);
Factory huaweiPhoneFactory = PhoneFactory.getFactory(HuaWeiPhoneFactory.class);
factoryMap.put(APPLEPHONE, applePhoneFactory);
factoryMap.put(HUAWEIPHONE, huaweiPhoneFactory);
}
/**
* 生产ApplePhone,打电话发短信
*/
@Test
public void testApplePhone() {
Factory factory = factoryMap.get(APPLEPHONE);
callAndSendMsg(factory, "yudaijing", "HelloWorld");
}
/**
* 生产ApplePhone,打电话发短信
*/
@Test
public void testHuaWeiPhone() {
Factory factory = factoryMap.get(HUAWEIPHONE);
callAndSendMsg(factory, "yudaijing", "HelloWorld");
}
/**
* 工厂生产出手机后就打电话发短信
*/
private void callAndSendMsg(Factory factory, String name, String msg) {
Phone phone = (Phone) factory.create();
phone.call(name);
phone.sendMessage(name, msg);
}
}
总结:一般来讲,创建复杂的、经常需要创建的对象就应该考虑使用工厂了,一般直接new方法就可以创建的JavaBean不建议使用工厂模式!