根据慕课网视频整理,视频地址:http://www.imooc.com/learn/261
什么是设计模式?
设计模式(design pattern)是一套被反复使用,多数人知晓的,经过分类编目的代码设计经验。
工厂模式的概念:
实例化对象,用工厂方法来代替new操作。
工厂模式包括工厂方法模式和抽象工厂模式,抽象工厂模式是工厂模式的扩展。
什么情况下适合工厂模式?
有一组类似的对象要创建
在编码时不能预见需要创见哪些类的实例
系统需要扩展,不应依赖于产品类实例如何被创建,组合和表达的细节
工厂模式
工厂模式类图
代码实现:
公共接口
package com.sunny.project;
/**
* 发型接口
* @author Administrator
*
*/
public interface HairInterface {
/**
* 画图
*/
public void draw();
}
左偏分发型实现类
package com.sunny.project;
/**
* 左偏分发型
* @author Administrator
*
*/
public class LeftHair implements HairInterface {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("--------左偏分发型-------");
}
}
右偏分发型实现类
package com.sunny.project;
/**
* 右偏分发型
* @author Administrator
*
*/
public class RightHair implements HairInterface {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("-----右偏分发型------");
}
}
发型工厂HairFactory
package com.sunny.project;
import java.util.Map;
/**
* 发型工厂
* @author Administrator
*
*/
public class HairFactory {
/**
* 根据类型来创建对象
* @param key
* @return
*/
public HairInterface getHair(String key){
if("left".equals(key)){
return new LeftHair();
}else if("right".equals(key)){
return new RightHair();
}
return null;
}
/**
* 根据类的名称来生产对象
* @param className
* @return
*/
public HairInterface getHairByClass(String className){
try {
HairInterface hair = (HairInterface) Class.forName(className).newInstance();
return hair;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
测试类:
package com.sunny.project;
public class SunnyTest {
public static void main(String[] args){
//根据类型来判断
HairFactory factory = new HairFactory();
HairInterface right = factory.getHair("right");
right.draw();
//根据类名来判断
HairInterface left = factory.getHairByClass("com.sunny.project.LeftHair");
left.draw();
}
}
抽象工厂模式
定义:
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要制定它们的具体类
使用场景:
一个对象族有相同的约束时可以使用抽象工厂模式
抽象工厂模式类图
男孩接口
package com.sunny.project;
/**
* 男孩
* @author Administrator
*
*/
public interface Boy {
public void drawMan();
}
女孩接口
package com.sunny.project;
/**
* 女孩子
* @author Administrator
*
*/
public interface Girl {
public void drawWomen();
}
圣诞节男孩实现类
package com.sunny.project;
/**
* 圣诞系列的男孩子
* @author Administrator
*
*/
public class MCBoy implements Boy {
@Override
public void drawMan() {
// TODO Auto-generated method stub
System.out.println("---圣诞系列的男孩子---");
}
}
新年男孩实现类
package com.sunny.project;
/**
* 新年系列的男孩子
* @author Administrator
*
*/
public class HNBoy implements Boy {
@Override
public void drawMan() {
// TODO Auto-generated method stub
System.out.println("---新年系列的男孩子---");
}
}
圣诞节女孩实现类
package com.sunny.project;
/**
* 圣诞系列的女孩
* @author Administrator
*
*/
public class MCGirl implements Girl {
@Override
public void drawWomen() {
// TODO Auto-generated method stub
System.out.println("---圣诞系列的女孩子---");
}
}
新年女孩实现类
package com.sunny.project;
/**
* 新年系列的女孩子
* @author Administrator
*
*/
public class HNGirl implements Girl {
@Override
public void drawWomen() {
// TODO Auto-generated method stub
System.out.println("---新年系列的女孩子---");
}
}
人物工厂接口
package com.sunny.project;
/**
* 人物的实现接口
* @author Administrator
*
*/
public interface PersonFactory {
//男孩接口
public Boy getBoy();
//女孩接口
public Girl getGirl();
}
圣诞节系列工厂接口
package com.sunny.project;
/**
* 圣诞系列加工厂
* @author Administrator
*
*/
public class MCFctory implements PersonFactory {
@Override
public Boy getBoy() {
// TODO Auto-generated method stub
return new MCBoy();
}
@Override
public Girl getGirl() {
// TODO Auto-generated method stub
return new MCGirl();
}
}
新年系列工厂接口
package com.sunny.project;
/**
* 新年系列加工厂
* @author Administrator
*
*/
public class HNFactory implements PersonFactory {
@Override
public Boy getBoy() {
// TODO Auto-generated method stub
return new HNBoy();
}
@Override
public Girl getGirl() {
// TODO Auto-generated method stub
return new HNGirl();
}
}
测试类
package com.sunny.project;
public class SunnyTest {
public static void main(String[] args){
PersonFactory facoty = new MCFctory();
Girl girl = facoty.getGirl();
girl.drawWomen();
PersonFactory facoty = new HNFactory();
Boy boy = facoty.getBoy();
boy.drawMan();
}
}