设计模式三:工厂方法模式
疑惑解答:
一.什么是工厂方法模式
1.interface接口不能够实例化(new),但是可以定义引用来指向继承该接口的实体类;
如:
interface animal{
void eat();
}
class Cat implements animal{
public void eat(){
System.out.println("The cat eat!");
}
}
animal an = new Cat();
一.什么是工厂方法模式
1.是简单工厂模式的进一步抽象;
2.定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
3.核心工厂类不再负责产品的创建,是一个抽象工厂角色,仅负责声明工厂子类必须实现的方法。
4.而所有的工厂之类都必须实现这个抽象工厂,并且每种产品都有一一对应的工厂子类负责产品的创建(实例化);
二.工厂方法模式的角色
产品:
1.产品父类或者接口: 具体产品的共同父类或接口。
2.具体产品类:具体的产品;工厂进行实例化的目标;
工厂:
1.抽象工厂(接口): 是工厂方法模式的核心。任何工厂子类都必须实现这个接口;
2.具体产品工厂:与具体的产品一一对应,负责创建具体产品的实例。
三.类图
四.深入分析
1.工厂方法模式相对于简单工厂模式而言,最大的特点是:将选择判断创建实例的权利交给了客户端。而不是一个统一的工厂。因此其在实现上克服了简单工厂违反“开方--封闭”的缺陷,实现了可扩展。
2. 工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具 体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体 的工厂就负责生产对应的产品。
3.应用场景:
a. 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
b. 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
五.代码
class Product{
int num;
int price;
}
// 具体产品
class ProductA extends Product{
public void setNum(int num){
num = num;
}
public void setName(String name){
name = name;
}
}
class ProductB extends Product{
public void setNum(int num){
num = num;
}
public void setName(String name){
name = name;
}
}
//抽象工厂类
interface Factory{
Product creatProduct();
}
//具体工厂子类
class ProductAFactory implemnets Factory{
public Product creatProduct(){
return new ProductA();
}
}
class ProductBFactory implements Factory{
public Product creatProduct(){
return new ProductB();
}
}
----------------------------------------
客户端代码:
Factory factory = new ProductAFactory();
Product product = factory.creatProduct(); //生产出具体的产品