前面我们总结了简单工厂,简单工厂运用非常广泛,但有局限性,适用于单用户,即一个Client(相对于工厂的客户),而一旦用户多了就不再适用。
这里我们引入工厂模式之工厂方法模式:
定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。
类图:
两个模块属于平级的关系
这里的createProduct方法就是工厂方法
clientA和B关注怎么制作产品
这里的生产者+消费者也叫创建者类(Creator)
代码实现:
Client.java
public abstract class Client {
public void orderProduct(String productName)
{
Product product = createProduct(productName);//调用工厂方法
if (product == null)
System.out.println("没有该产品");
else
product.welcomeToUse();
}
protected abstract Product createProduct(String type);//工厂方法抽象
}
ClientA.java
public class ClientA extends Client{
protected Product createProduct(String type)
{//工厂方法实现
Product product=null;
if(type.equals("productA"))
product = new ProductA();
else if (type.equals("productB"))
product = null
return product;
}
}
ClientB.java
public class ClientB extends Client{
protected Product createProduct(String type)
{
Product product=null;
if(type.equals("productA"))
product = null;
else if (type.equals("productB"))
product = new ClientBProductB();
return product;
}
}
Product.java
public abstract class Product {
private String name;
private String Price;
abstract void welcomeToUse();
}
ClientAProductA.java
public class ClientAProductA extends Product {
String name="productA";
String price="12";
void welcomeToUse()
{
System.out.println(name+":"+price);
}
}
ClientBProductB.java
public class ClientBProductB extends Product {
String name="productB";
String price="14";
void welcomeToUse()
{
System.out.println(name+":"+price+",并赠送你张1元消费券");
}
}
测试代码:
Client client1 = new ClientA();
client1.orderProduct("productA");
Client client2 = new ClientB();
client2.orderProduct("productB");
运行结果:
总的来说相对于简单工厂,工厂方法将SimpleProductFactory的功能封装成了一个抽象方法,使得可以有多个Client使用,且能确定使用到具体的Client相对应的产品。相对于传统方法,减少了对具体类的依赖,这里引入新的设计原则,即要依赖抽象,不要依赖具体类,这条设计原则也叫依赖倒置原则。