您的位置:首页 > 其它

常用的设计模式----工厂模式

2017-06-13 17:36 513 查看

工厂模式:

作用:实例化对象,代替new操作

应用场景:以选择脸萌选择【发型】和【面部特征为例】



有一组类似的对象(发型),需要在不同的业务场景中动态的创建(客户端选择不同的发型);

随着业务的发展,很难在设计初期就准备好所有种类的接口(发型车间)和实例对象(中分,左分);

考虑到系统的扩展性(增加面部特征)和易维护性(修改,增加发型),这时候应该使用工厂方法模式。

优点:

一个对象的依赖对象发生变化,与本身无关,实现了低耦合

客户端与具体的业务分离,也是实现了低耦合

工厂方法模式:

相当于工厂里的生产车间,真正做事儿的部门

具体实现步骤:

步骤1:创建接口和实现类

接口:

public interface HairInterface {

public void draw();
}


实现类:

public class RightHair implements HairInterface {

@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("-----------------右偏分发型-------------------");
}


public class LeftHair implements HairInterface {

@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("-----------------左偏分发型-------------------");
}


public class InHair implements HairInterface {

@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("-----------------中分发型-------------------");

}


步骤2:创建.properties文件,编辑key和value值

key1=value1
key2=value2
key3=value3
例如:
left=com.sunny.project.LeftHair
right=com.sunny.project.RightHair
in=com.sunny.project.InHair


步骤3:创建【方法工厂】

public class HairFactory {
/**
* 根据key值生产对象
* @param className
* @return
*//
public HairInterface getHairByClassKey(String key){

try {
//以键值对的格式获取.properties里的值。/
Map<String, String> map = new PropertiesReader().getProperties();

//通过类名获取相应的实例对象(利用反制机制,实现面向对象的多态特性)。/
HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance();
return hair;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}


步骤4:用【方法工厂】创建实例对象,并使用对应方法

HairFactory factory = new HairFactory();
HairInterface hair1 = factory.getHairByClassKey("in");
HairInterface hair2 = factory.getHairByClassKey("left");
HairInterface hair3 = factory.getHairByClassKey("right");
hair1.draw();
hair2.draw();
hair3.draw();


抽象工厂模式:

相当于工厂里的指挥部门,为生产车间下达指令

工厂方法模式与抽象工厂模式的区别

如下图所示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: