工厂方法模式
来源>http://blog.youkuaiyun.com/lfdfhl/article/details/77977256
核心思想:将不同的产品交由各自的工厂生产,每个工厂生产特定的对象
工厂方法模式的4种角色
- 抽象产品: 接口或抽象类,负责产品角色的定义
- 具体产品: 实现抽象产品,实际操作对象
- 抽象工厂: 对工厂的抽象,负责定义工厂角色的功能等
- 具体产品工厂: 实现抽象工厂方法,负责生产对应的产品
- 客户端:
看个例子
抽象产品
public interface Mobile(){
public void call(String no);
}
抽象产品Mobile接口,定义了方法call(String):void,也即归纳了抽象产品的一个功能接口,实际应用时还有开机关机等接口
具体产品
public class StMobile implements Mobile {
public StMobile() {
System.out.println("标配mobile");
}
public void call(String no) {
System.out.println("标配 calling... : " + no);
}
}
public class ProMobile implements Mobile {
public ProMobile() {
System.out.println("高配mobile");
}
public void call(String no) {
System.out.println("高配 calling...:" + no);
}
}
抽象工厂
public interface MobileFactory {
public Mobile createMobile();
}
对工厂类的一种抽象,工厂类具有方法createMobile():Mobile
具体产品工厂
StMobileFactory工厂实现了抽象工厂的方法,生产产品StMobile:
public class StMobileFactory implements MobileFactory {
@Override
public Mobile createMobile() {
return new StMobile();
}
}
ProMobileFactory 工厂实现了抽象工厂的方法,生产产品ProMobile:
public class ProMobileFactory implements MobileFactory {
@Override
public Mobile createMobile() {
return new ProMobile();
}
}
客户端
public class TestMain {
public static void main(String[] args) {
MobileFactory factory = new StMobileFactory();
Mobile mobile = factory.createMobile();
mobile.call("15098764321");
/**
factory = new ProMobileFactory();
Mobile proMobile = factory.createMobile();
proMobile .call("15098764321");
**/
}
}
分析
工厂方法模式 是简单工厂模式 的改进型,由同一个工厂生产产品改为由不同的工厂生产不同的产品,简单工厂模式不适合实际业务需求,因为存在潜在的类型变化,工厂方法模式改进了这一限制,当有新产品加入时,分2步走:
. 定义一个产品类实现抽象产品接口
. 定义一个产品工厂实现工厂接口
完成这2步,就可以在客户端用新的工厂生产新的产品
改进
这几篇关于工厂模式的短文是来源于别人的分享,里面加入了自己的理解,作为一个学习的整理,算转载吧,其中对工厂方法模式改进做的比较好的就是引入泛型,来源>http://blog.youkuaiyun.com/lfdfhl/article/details/77977256
泛型的引入可以减少工厂类的定义
抽象工厂
public interface GenericMobileFactory {
public <T extends Mobile> T createMobile(Class<T> clazz);
}
具体产品工厂
public class GenericMobileFactoryImpl implements GenericMobileFactory {
@SuppressWarnings("unchecked")
@Override
public <T extends Mobile> T createMobile(Class<T> clazz) {
T mobile = null;
try {
mobile = (T) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return mobile;
}
}
引入泛型,利用反射,生成一个产品对象,然后强制转换为泛型参数类型
客户端
public class GenericTestMain {
public static void main(String[] args) {
GenericMobileFactory factory = new GenericMobileFactoryImpl();
Mobile mobile = factory.createMobile(StMobile.class);
mobile.call("15098764321");
/*
Mobile other = factory.createMobile(ProMobile.class);
other.call("15098764321");
*/
}
}
当有新的产品类型加入是,只需定义新的产品类,实现抽象产品接口,即可在客户端通过泛型的抽象工厂生产指定产品。

本文详细介绍了工厂方法模式的核心思想及其实现方式,包括抽象产品、具体产品、抽象工厂和具体产品工厂的概念,并给出了具体的代码示例。

被折叠的 条评论
为什么被折叠?



