工厂模式:
工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式
角色与结构:
简单工厂模式就是由一个工厂类根据传入的参量创建出那一种产品类的实例。下面以一个示意性的实现为例说明简单工厂模式的结构:
示例部分代码:
//静态工厂方法
Public static Fruit factory(String which){
If(which.equalsIgnoreCase(“apple”)){
Return new Apple();
}else if(which.equalsIgnoreCase(“strawberry”)){
Return new Strawberry();
}else if(which.equalsIgnoreCase(“grape”)){
Return new Grape();
}
}
工厂方法模式:
工厂方法模式使用了多态性,工厂方法模式保持了简单工厂模式的优点,克服了静态工厂方法的缺点。
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
示例结构图:
示例代码:
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 ContreteCreator2();
prod2 = creator2.factory();
}
}
public interface Creator {
/**
* 工厂方法
*/
public Product factory();
}
public class ConcreteCreator1 implements Creator {
@Override
public Product factory() {
return new ConcreteProduct1();
}
}
public class ContreteCreator2 implements Creator {
@Override
public Product factory() {
return new ConcreteProduct2();
}
}
//标识接口
public interface Product{
}
public class ConcreteProduct1 implements Product {
public ConcreteProduct1(){
}
}
public class ConcreteProduct2 implements Product {
public ConcreteProduct2(){
//do something
}
}
抽象工厂(Abstract Facotry)模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
一个产品等级结构图:
多个相平行的产品等级结构图:
通过使用抽象工厂模式,可以处理具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题。
图中就是两个具有相同等级结构的产品族A和产品等级结构B的结构图:
采用抽象工厂模式设计出的系统类图如下图所示:
一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少具体工厂。
示例代码:
public interface Creator {
/**产品等级结构A的工厂方法*/
public ProductA factoryA();
/**产品等级结构B的工厂方法*/
public ProductB factoryB();
}
public class ConcreteCreator1 implements Creator {
/**产品等级结构A的工厂方法*/
@Override
public ProductA factoryA() {
return new ProductA1();
}
/**产品等级结构B的工厂方法*/
@Override
public ProductB factoryB() {
return new ProductB1();
}
}
public class ConcreteCreator2 implements Creator {
/**产品等级结构A的工厂方法*/
@Override
public ProductA factoryA() {
return new ProductA2();
}
/**产品等级结构B的工厂方法*/
@Override
public ProductB factoryB() {
return new ProductB2();
}
}
public interface ProductA {
}
public class ProductA1 implements ProductA {
public ProductA1(){
}
}
public class ProductA2 implements ProductA {
public ProductA2(){
}
}
public interface ProductB {
}
public class ProductB1 implements ProductB {
public ProductB1(){
}
}
public class ProductB2 implements ProductB {
public ProductB2(){
}
}
抽象工厂方法对应的相图:
在简单工厂模式中,只有一个工厂角色和一个产品的等级结构。对应相图结构:
在工厂方法模式中,只有一个产品的等级结构,工厂的等级结构与产品的等级结构是平行的。对应的相图