您的位置:首页 > 其它

Design Pattern ——Factory Method&Abstract Factory

2015-12-07 19:14 621 查看
今天开始复习设计模式。设计模式相关的资料有很多,概念性的东西就画个图就可以了。把关注点放在例子上,设计模式还是要使用中才有感受。

从Factory Method&Abstract Factory开始。

一、Factory Method

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。



我们的例子如下:

我们项目中有一个代码提交记录releasenote,我们需要将这个releasenote分成csv/xls/xml格式分别导出



public interface ReleasenoteFactory {

public Releasenote exportReleasenote();

}


public interface Releasenote {

public void exportFile();

}


public class CSVReleasenoteFactory implements ReleasenoteFactory {

@Override
public Releasenote exportReleasenote() {
// TODO Auto-generated method stub
return new CSVReleasenote();
}

}


public class CSVReleasenote implements Releasenote {

@Override
public void exportFile() {
csvOperation();
}

public void csvOperation(){
System.out.println("CSV");
}

}


public class XlsReleasenoteFactory implements ReleasenoteFactory {

@Override
public Releasenote exportReleasenote() {
// TODO Auto-generated method stub
return new XlsReleasenote();
}

}


public class XlsReleasenote implements Releasenote {

@Override
public void exportFile() {
xlsOperation();
}

public void xlsOperation(){
System.out.println("xls");
}
}


public class XmlReleasenoteFactory implements ReleasenoteFactory {

@Override
public Releasenote exportReleasenote() {
// TODO Auto-generated method stub
return new XmlReleasenote();
}

}


public class XmlReleasenote implements Releasenote {

@Override
public void exportFile() {
xmlOperation();
}

public void xmlOperation(){
System.out.println("xml");
}
}


客户端的调用如下:

ReleasenoteFactory F1 = new CSVReleasenoteFactory();
ReleasenoteFactory F2 = new XlsReleasenoteFactory();
ReleasenoteFactory F3 = new XmlReleasenoteFactory();

F1.exportReleasenote().exportFile();
F2.exportReleasenote().exportFile();
F3.exportReleasenote().exportFile();


二、Abstract Factory

抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。



抽象工厂模式,就以《java与模式》中的电脑的例子来学习:

我们知道计算机配件的生产是要配套进行的,PC和MAC是完全不同的两条生产过程,CPU RAM也是完全不同

这个例子中产品族有两个,一个是PC,一个是MAC。产品等级结构有两个,一个是RAM,一个是CPU



public interface ComputerProducer {

Cpu createCpu();
Ram createRam();

}


public class MacProducer implements ComputerProducer {

@Override
public Cpu createCpu() {
// TODO Auto-generated method stub
return new MacCpu();
}

@Override
public Ram createRam() {
// TODO Auto-generated method stub
return new MacRam();
}

}


public class PcProducer implements ComputerProducer {

@Override
public Cpu createCpu() {
// TODO Auto-generated method stub
return new PcCpu();
}

@Override
public Ram createRam() {
// TODO Auto-generated method stub
return new PcRam();
}

}


public interface Cpu {

public void cpuOperation();

}


public class PcCpu implements Cpu {

@Override
public void cpuOperation() {
System.out.println("Pc Cpu processing!");

}

}


public class MacCpu implements Cpu {

@Override
public void cpuOperation() {
System.out.println("Mac cpu processing!");
}

}


public interface Ram {

public void ramOperation();

}


public class PcRam implements Ram {

@Override
public void ramOperation() {
System.out.println("Pc Ram processing!");

}

}


public class MacRam implements Ram {

@Override
public void ramOperation() {
System.out.println("Mac Ram processing!");

}

}


最后在客户端调用

public class Client {

public static void main(String[] args){
ComputerProducer pcFactory = new PcProducer();
ComputerProducer macFactory = new MacProducer();
Cpu pcCpu = pcFactory.createCpu();
Ram pcRam = pcFactory.createRam();
Cpu macCpu = macFactory.createCpu();
Ram macRam = macFactory.createRam();
pcCpu.cpuOperation();
pcRam.ramOperation();
macCpu.cpuOperation();
macRam.ramOperation();
}

}


参考资料:

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