基于java的设计模式(3)工厂

来源:互联网 发布:修复老电影软件下载 编辑:程序博客网 时间:2024/06/05 15:44

这是对慕课网工厂设计模式的笔记,便于以后查看

demo1

package Factory;


public interface Hairinterface {
public void draw();
}

package Factory;


public class leftHair implements Hairinterface {


@Override
public void draw() {
System.out.println("左边");
}


}

package Factory;


public class rightHair implements Hairinterface {


@Override
public void draw() {
System.out.println("右边");
}


}


package Factory;


public class test {
public static void main(String[] args) {
Hairinterface left = new leftHair();
left.draw();
Hairinterface right = new rightHair();
right.draw();
}
}

运行结果:

左边
右边


现在设计一个根据类型创建对象

public  Hairinterface getHair(String key){
if("left".equals(key)){
return new leftHair();
}else if("right".equals(key)){
return new rightHair();
}
return null;
}

测试:

HairFactory hairFactory = new HairFactory();
Hairinterface right = hairFactory.getHair("right");
right.draw();
Hairinterface left = hairFactory.getHair("left");
left.draw();

运行结果:

右边
左边

现在使用反射设计根据类的名称来生产对象

public Hairinterface getHairByClassName(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class classzz = Class.forName(className);
Hairinterface hair = (Hairinterface)classzz.newInstance();
return hair;
}

测试:

Hairinterface hair = hairFactory.getHairByClassName("Factory.rightHair");
hair.draw();

结果:

右边

对这个方法进行升级,将这个类的全名称使用配置文件进行映射别名

package Factory;


import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


/**
 * @describe properties文件读取类
 * @author zc
 * @version 1.0 2017-08-27
 */
public class PropertiesReader {

public Map<String,String> getProperties(){
Properties props = new Properties();
Map<String,String> map = new HashMap<String,String>();
try{
InputStream in = getClass().getResourceAsStream("type.properties");
props.load(in);
@SuppressWarnings("unchecked")
Enumeration<String> en = (Enumeration<String>) props.propertyNames();
while (en.hasMoreElements()) {
String key = en.nextElement();
String property = props.getProperty(key);
map.put(key, property);
}
in.close();
}catch (Exception e) {
e.printStackTrace();
}
return map;
}
}

配置文件

rightHair=Factory.rightHair

测试:


HairFactory hairFactory = new HairFactory();
Hairinterface hair = hairFactory.getHairByClassKey("rightHair");
hair.draw();

结果:右边

以上就是工厂模式。

接下来讨论抽象工厂模式

设计一个男孩和女孩的接口,和圣诞男孩、女孩,新年男孩、女孩

package Factory.boy;


public interface Boy {
public void draw();
}


package Factory.boy;


public class HnBoy implements Boy {
public void draw(){
System.out.println("新年系列的男孩");
}
}


package Factory.boy;


public class McBoy implements Boy {
public void draw(){
System.out.println("圣诞的男孩");
}
}


女孩同理

设计抽象工厂

package Factory;


import Factory.Girl.Girl;
import Factory.boy.Boy;


public interface PersionFactory {
public Boy getBoy();
public Girl getGirl();
}

设计生产新年系列的工厂

package Factory;


import Factory.Girl.Girl;
import Factory.Girl.HnGirl;
import Factory.Girl.McGirl;
import Factory.boy.Boy;
import Factory.boy.HnBoy;
import Factory.boy.McBoy;


public class HnFactory implements PersionFactory {


@Override
public Boy getBoy() {

return new HnBoy();
}


@Override
public Girl getGirl() {

return new HnGirl();
}


}

圣诞系列同理

测试

package Factory;


import Factory.Girl.Girl;
import Factory.Girl.HnGirl;
import Factory.Girl.McGirl;
import Factory.boy.Boy;
import Factory.boy.HnBoy;
import Factory.boy.McBoy;


public class HnFactory implements PersionFactory {


@Override
public Boy getBoy() {

return new HnBoy();
}


@Override
public Girl getGirl() {

return new HnGirl();
}


}

结果:

圣诞的男孩
圣诞的女孩
新年系列的男孩
新年系列的女孩

工厂方法模式图示


抽象工厂模式图示:


对比
工厂模式是一种极端情况下的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广
工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的等级结构工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类

工厂模式的实现帮助我们

系统可以在不修改具体工厂角色的情况下引进新的产品客户端不必关系对象如何创建,明确了职责更好的理解面向对象的原则,面向接口编程,而不要面向实现编程

工厂模式适用于哪些场景

一个系统应当不依赖于产品类实例被创立、组成和表示的细节。这对所有形态的工厂模式都是重要的这个系统的产品有至少一个的产品族同属于一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节