目录

工厂模式

Factory

简单工厂模式 Simple Factory Pattern

又称静态工厂方法模式,使用静态的方法创建对象。

组成:

  • 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

  • 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

  • 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
//抽象产品角色
public abstract class Pizza {
   abstract void what();
}
//具体产品角色
public class CheesePizza implements Pizza {
    @Override
    public void what() {
       System.out.println("CheesePizza");
   }
}
public class PepperoniPizza implements Pizza {
    @Override
    public void what() {
        System.out.println("PepperoniPizza");
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 工厂类角色,它只做一件事情:帮它的客户创建披萨
public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null; 
        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        }
      
        return pizza;
    }
}

工厂方法模式 Factory Method Pattern

组成

  • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

  • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
//抽象产品角色
public interface Moveable {
    void run();
}
//具体产品角色
public class Plane implements Moveable {
    @Override
    public void run() {
       System.out.println("plane....");
   }
}
public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
//抽象工厂
public abstract class VehicleFactory {
    abstract Moveable create();
}
//具体工厂
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}
public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}

测试

1
2
3
4
5
6
7
8
//测试类
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}

抽象工厂模式 Abstract Factory Pattern

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。

抽象产品

1
2
3
4
5
6
public abstract class Food {
    public abstract void what();
}
public abstract class Weapon {
    public abstract void power();
}

具体产品

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Apple extends Food{
    @Override
    public void what() {
       System.println("Apple");
    }
}
public class AK47 extends Weapon{
    @Override
    public void power() {
       System.println("power 90");
    }
}

抽象工厂

1
2
3
4
public abstract class AbstractFactory {
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}

具体工厂

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class FirstFactory extends AbstractFactory{
    @Override
    public Food createFood() {
        return new Apple();
    }
    @Override
    public Weapon createWeapon() {
        return new AK47();
    }
}

总结

  • 简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。
  • 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
  • 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。