提到工厂我们就离不开一个词——产品,在我们现实生活中,社会分工越来越细并且越来越专业,各种产品都有专门的工厂生产,比如现在马上入伏了,天气炎热,快乐肥宅水(可乐)我相信很多人跟我一样都离不开它,快乐肥宅水常见的俩个品牌就是可口可乐以及百事可乐,这俩种可乐分别来自不同的工厂,下面用代码来阐述下俩种工厂生产快乐肥宅水的过程。
首先我们得把工厂抽象出来,抽象工厂,这是该模式第一个主要角色
public interface ColaFactory {
Product product();
}
工厂是可以生产产品的,所以有个方法product(),product返回值是一个产品接口,也就是我们该模式设计到的第二个角色,抽象产品,代码如下:
public interface Product {
String getName();
}
接下来我们来创建可口可乐工厂以及百事可乐工厂,这是该模式第三个主角,具体工厂:
public class CocaColaFactory implements ColaFactory {
@Override
public Product product() {
return new CocaCola();
}
}
public class PepsiColaFactory implements ColaFactory {
@Override
public Product product() {
return new PepsiCola();
}
}
具体的工厂生产具体的产品,第四个主角就出现了,具体产品:
public class CocaCola implements Product{
@Override
public String getName() {
return "可口可乐";
}
}
public class PepsiCola implements Product {
@Override
public String getName() {
return "百事可乐";
}
}
写个例子测试一下:
public class start {
public static void main(String[] args) {
ColaFactory colaFactory1 = new CocaColaFactory();
Product product1 = colaFactory1.product();
System.out.println("可口可乐工厂生产出" + product1.getName());
ColaFactory colaFactory2 = new PepsiColaFactory();
Product product2 = colaFactory2.product();
System.out.println("百事可乐工厂生产出" + product2.getName());
}
}
结果如下:
下面附上工厂方法模式的UML图(此图来源《软件设计模式:Java版》):
假如由于现在天气太热,快乐肥宅水的需求量太大,可口可乐公司跟百事可乐公司供不应求,正好有家公司提供代理生产,它既可以生产可口可乐,也可以生产百事可乐,下面我们用代码来实现这家代理公司生产过程,这时候工厂方法模式就退化成简单工厂模式。
代理工厂代码:
public class ColaProxyFactory {
public Product product(String carName){
if(carName.equals("coca")){
return new CocaCola();
}else if (carName.equals("pepsi")){
return new PepsiCola();
}else {
return null;
}
}
}
测试代码:
public class start {
public static void main(String[] args) {
ColaProxyFactory colaProxyFactory = new ColaProxyFactory();
//生产可口可乐
Product coca = colaProxyFactory.product("coca");
System.out.println("生产出" + coca.getName());
//生产百事可乐
Product pepsi = colaProxyFactory.product("pepsi");
System.out.println("生产出" + pepsi.getName());
}
}
结果:
注意:简单工厂模式不属于GOF的23中经典设计模式。



