1.1 标准定义
工厂模式标准定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
1.2 分析和说明
工厂模式是一个创建性的模式。它要求工厂类和产品类分开。由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例,但这些不同的实例有共同的父类。FactoryMethod把创建这些实例的具体过程封装起来了。当一个类无法预料将要创建哪种类的对象或一个类需要由其指定创建的对象时,就需要用到工厂模式了。
工厂模式涉及到抽象工厂角色、具体工厂角色、抽象产品角色以及具体产品角色。
抽象工厂角色:任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类或接口实现。
具体工厂角色:担任这个角色的是实现了抽象工厂接口的具体类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在实际的系统中这个角色使用类实现。
抽象产品角色:工厂方法模式所创建的对象的超类型,也就是共同产品对象的共同父 类或拥有的接口。
具体产品角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每个对象都是某个具体产品角色的实例。
2 应用场景举例
比如某一类公司能提供一种产品,但是这种产品有不同的型号。当客户需要一种产品,但是没有具体是哪一种型号,只是提供了一些产品参数,公司就根据这些参数来提供产品。这就是工厂模式。
在这里可以把公司理解为抽象工厂角色。CompanyA是具体工厂角色。Product是抽象产品角色。ProductA和ProductB是具体产品角色。其类图如下:
工厂模式实现的顺序描述:(1)客户首先创建一个具体的公司 (2)客户向公司申请一个产品并传入产品参数 (3)具体公司按照客户要求新建一个产品 (4)具体公司把产品返回给客户 (5) 客户调用产品方法
3 Java的实现代码
Java 程序实现主要包括Company接口文件,Product接口文件,CompanyA类文件,ProductA和ProductB类文件等5个文件。
Company接口为工厂角色
public interface Company{
public Product buildProduct(String Parameter);
}
Product接口为抽象产品角色
public interface Product{
public String productType = null;
public String getProductType();
public void doUse();
}
public class CompanyA implement Company {
public Product buildProduct(String Parameter){
if(Parameter.equals("A")){
return new ProductA();
}else if(Parameter.equals("B")){
return new ProductB();
}else return null;
}
}
</pre><pre name="code" class="java"><span style="white-space:pre"> </span>ProductA和ProductB为具体产品角色
<pre name="code" class="java">public class ProductA implements Product {
public String productType = "ProductA";
private String productParametre = "A";
public String getProductType(){
return productTye;
}
public String getParameter(){
return productParameter;
}
public void doUse(){
System.out.println("这是ProductA实现的功能");
}
}
public class ProductB implements Product {
public String productType = "ProductB";
private String productParametre = "B";
public String getProductType(){
return productTye;
}
public String getParameter(){
return productParameter;
}
public void doUse(){
System.out.println("这是ProductB实现的功能");
}
}
</pre><span style="white-space:pre"></span>工厂模式测试程序的代码如下:<p></p><pre>
<pre name="code" class="java">public class client{
public static void main(String[] args){
Company company = new CompanyA();
Product product = company.buildProduct("A");
product.doUse();
product = company.buildProduct("B");
product.doUse();
}
}