设计模式之工厂方法模式
2015-11-30 11:31
211 查看
在上一篇中学了简单工厂方法模式,今天来此记录下自己对工厂方法模式的理解,如有错误请指出,相互学习。
工厂方法模式:
是一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
与简单工厂方法模式的区别:
简单工厂方法模式:工厂类是一个具体的类负责创建具体的产品实例
工厂方法模式:工厂类是一个抽象的接口负责的是创建子工厂,通过子工厂再去创建具体的产品实例
下面看下他们的类图加深理解下区别:
简单工厂方法模式的类图:
工厂方法模式的类图:
还是以车为情景实现一下这个工厂方法模式,这回是制造汽车:
产品抽象(Car):
package com.desgin_factory.cn;
/**
* 抽象产品
* @author Administrator
*
*/
public interface Car {
//价格
public void Money();
//重量
public void Weight();
}
宝马车实例:
package com.desgin_factory.cn;
/**
* 抽象产品的具体实现 车的类型之一 :宝马车
* @author Administrator
*
*/
public class BaoMa implements Car {
@Override
public void Money() {
// TODO Auto-generated method stub
System.out.println("这辆宝马90万");
}
@Override
public void Weight() {
// TODO Auto-generated method stub
System.out.println("这辆宝马重5000斤");
}
}
奔驰车实例:
package com.desgin_factory.cn;
/**
* 抽象产品的具体实现 车的类型之一 :奔驰车
* @author Administrator
*
*/
public class BenChi implements Car{
@Override
public void Money() {
// TODO Auto-generated method stub
System.out.println("这辆奔驰80万");
}
@Override
public void Weight() {
// TODO Auto-generated method stub
System.out.println("这辆奔驰重6000斤");
}
}
工厂接口:(核心) ——工厂方法模式的核心
package com.desgin_factory.cn;
public interface Factory {
//汽车制造厂
public Car CarFactory();
}
具体的汽车制造厂——宝马制造厂:
package com.desgin_factory.cn;
public class BaoMaFactory implements Factory{
@Override
public Car CarFactory() { //宝马制造厂
Car car = null;
car = new BaoMa();
return car;
}
}
具体的汽车制造厂——奔驰制造厂:
package com.desgin_factory.cn;
public class BenChiFactory implements Factory{
@Override
public Car CarFactory() { //奔驰制造厂
Car car = null;
car = new BenChi();
return car;
}
}
这个模式的测试类(Test)相当于找制造厂生产车的商人:
package com.desgin_factory.cn;
public class Test {
public static void main(String []args){
//找宝马制造厂生产宝马车
Factory factory = new BaoMaFactory();
Car car = factory.CarFactory();
car.Money();
car.Weight();
//找奔驰制造厂生产奔驰车
System.out.println("*****************************");
Factory Bfactory = new BenChiFactory();
Car bcar = Bfactory.CarFactory();
bcar.Money();
bcar.Weight();
}
}
运行结果:
[b]Java文件目录结构:
如果需要生产奥迪 、法拉利、宾利 等车就增加一个Car的具体实例,然后增加一个生产该车的工厂即可,不用修改源代码,也符合开闭原则。
个人觉得利用反射的简单工厂方法模式增加一个新的实例都可以不用修改工厂或者增加工厂,而且工厂方法模式还得增加一个工厂的具体实例如果有大量的实例产品增加,就得增加很多工厂类,这一点本人还没有理解,当然工厂方法模式对于没有用反射思想的简单工厂方法模式进行了缺点的弥补。没用反射的简单工厂方法模式增加一个实例产品就得修改工厂类了而不是增加一个一个具体的工厂类实例,这样会违背单一职责原则。所以对于没有用反射技术的简单工厂方法模式而言,工厂方法模式就是简单工厂方法模式的一个加强版,修复了增加新产品违背单一职责原则这一bug。(纯属个人理解)
工厂方法模式:
是一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
与简单工厂方法模式的区别:
简单工厂方法模式:工厂类是一个具体的类负责创建具体的产品实例
工厂方法模式:工厂类是一个抽象的接口负责的是创建子工厂,通过子工厂再去创建具体的产品实例
下面看下他们的类图加深理解下区别:
简单工厂方法模式的类图:
工厂方法模式的类图:
还是以车为情景实现一下这个工厂方法模式,这回是制造汽车:
产品抽象(Car):
package com.desgin_factory.cn;
/**
* 抽象产品
* @author Administrator
*
*/
public interface Car {
//价格
public void Money();
//重量
public void Weight();
}
宝马车实例:
package com.desgin_factory.cn;
/**
* 抽象产品的具体实现 车的类型之一 :宝马车
* @author Administrator
*
*/
public class BaoMa implements Car {
@Override
public void Money() {
// TODO Auto-generated method stub
System.out.println("这辆宝马90万");
}
@Override
public void Weight() {
// TODO Auto-generated method stub
System.out.println("这辆宝马重5000斤");
}
}
奔驰车实例:
package com.desgin_factory.cn;
/**
* 抽象产品的具体实现 车的类型之一 :奔驰车
* @author Administrator
*
*/
public class BenChi implements Car{
@Override
public void Money() {
// TODO Auto-generated method stub
System.out.println("这辆奔驰80万");
}
@Override
public void Weight() {
// TODO Auto-generated method stub
System.out.println("这辆奔驰重6000斤");
}
}
工厂接口:(核心) ——工厂方法模式的核心
package com.desgin_factory.cn;
public interface Factory {
//汽车制造厂
public Car CarFactory();
}
具体的汽车制造厂——宝马制造厂:
package com.desgin_factory.cn;
public class BaoMaFactory implements Factory{
@Override
public Car CarFactory() { //宝马制造厂
Car car = null;
car = new BaoMa();
return car;
}
}
具体的汽车制造厂——奔驰制造厂:
package com.desgin_factory.cn;
public class BenChiFactory implements Factory{
@Override
public Car CarFactory() { //奔驰制造厂
Car car = null;
car = new BenChi();
return car;
}
}
这个模式的测试类(Test)相当于找制造厂生产车的商人:
package com.desgin_factory.cn;
public class Test {
public static void main(String []args){
//找宝马制造厂生产宝马车
Factory factory = new BaoMaFactory();
Car car = factory.CarFactory();
car.Money();
car.Weight();
//找奔驰制造厂生产奔驰车
System.out.println("*****************************");
Factory Bfactory = new BenChiFactory();
Car bcar = Bfactory.CarFactory();
bcar.Money();
bcar.Weight();
}
}
运行结果:
[b]Java文件目录结构:
如果需要生产奥迪 、法拉利、宾利 等车就增加一个Car的具体实例,然后增加一个生产该车的工厂即可,不用修改源代码,也符合开闭原则。
个人觉得利用反射的简单工厂方法模式增加一个新的实例都可以不用修改工厂或者增加工厂,而且工厂方法模式还得增加一个工厂的具体实例如果有大量的实例产品增加,就得增加很多工厂类,这一点本人还没有理解,当然工厂方法模式对于没有用反射思想的简单工厂方法模式进行了缺点的弥补。没用反射的简单工厂方法模式增加一个实例产品就得修改工厂类了而不是增加一个一个具体的工厂类实例,这样会违背单一职责原则。所以对于没有用反射技术的简单工厂方法模式而言,工厂方法模式就是简单工厂方法模式的一个加强版,修复了增加新产品违背单一职责原则这一bug。(纯属个人理解)
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- asp.net 简单工厂模式和工厂方法模式之论述
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- C#设计模式之观察者模式实例讲解
- C#设计模式之单例模式实例讲解
- 学习JavaScript设计模式(接口)
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- 设计模式之六大设计原则