what:工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。
三种:简单工厂模式、工厂方法模式、抽象工厂模式
简单工厂模式:或称静态工厂方法模式,是不同的工厂方法模式的一个特殊实现。简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色等三个角色:
工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。
抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。
具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。
源代码:
Creator:
public class Creator{
/*
* 静态工厂方法
*/
public static Product factory(){
return new ConcreateProduct();
}
}
Product:
public interface Product{
}
ConcreateProduct:
public class ConcreateProduct implements Product{
public ConcreateProduct(){}
}
产品对象的循环使用和登记式的工厂方法
工厂方法总是简单地调用产品类的构造子以创建一个新的产品实例,然后将这个实例提供给客户端。单例模式和多例模式是建立在简单工厂模式的基础之上的,而且它们都要求工厂方法具有特殊的逻辑,以便能循环使用产品的实例。
工厂方法模式系统涉及到的角色:
抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中,这个角色由Java接口Creator扮演;在实际的系统中,这个角色也常常使用抽象Java类实现。
具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在实际系统中,这个角色也常常使用抽象Java类实现。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
源代码:
Creator:
public interface Creator{
//工厂方法
public Product factory();
}
Product:
public interface Product{}
ConcreteCreator1:
public class ConcreteCreator1 implements Creator{
//工厂方法
public Product factory(){
return new ConcreteProduct1();
}
}
ConcreteCreator2:
public class ConcreteCreator2 implements Creator{
//工厂方法
public Product factory(){
return new ConcreteProduct2();
}
}
ConcreteProduct1:
public class ConcreteProduct1 implements Product{
public ConcreteProduct1(){
//do something
}
}
ConcreteProduct2:
public class ConcreteProduct2 implements Product{
public ConcreteProduct2(){
//do something
}
}
Client:public class Client{
private static Creator creator1,creator2;
private static Product prod1,prod2;
public static void main(String[] args){
creator1=new ConcreteCreator1();
prod1=creator1.factory();
creator2=new ConcreteCreator2();
prod2=creator2.factory();
}
}
Client对象的活动可以分为两部分:
客户端创建(ConcreteCreator1)对象。这时客户端所持有变量的静态类型是Creator;而实际类型是ConcreteCreator1。然后,客户端调用ConcreteCreator1对象的工厂方法factory(),接着后者调用ConcreteProduct1的构造子创建出产品对象。
客户端创建一个ConcreteCreator1对象,然后调用ConcreteCreator2对象的工厂方法factory(),而后者调用ConcreteCreator2的构造子创建出产品对象。