工厂模式

2018-03-02  本文已影响0人  水欣

简单工厂模式

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
它的组成:

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

    public static Car driverCar(String s) throws Exception {
        if (s.equalsIgnoreCase("Benz")) {
            return new Benz();
        } else if (s.equalsIgnoreCase("Bmw")) {
            return new Bmw();
        } else {
            throw new Exception();
        }
    }
}
  1. 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现
public interface Car {

    void drive();
}
  1. 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中有一个具体类实现。
public class Benz implements Car {

    public void drive() {
        System.out.println("Driving Benz");
    }

}

public class Bmw implements Car {

    public void drive() {
        System.out.println("Driving Bmw");
    }
}

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式中集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
工厂方法模式的结构

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

    Car driverCar();
}
  1. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
public class BenzDriver implements Driver {

    public Car driverCar() {
        return new Benz();
    }

}

public class BmwDriver implements Driver {

    public Car driverCar() {
        return new Bmw();
    }

}
  1. 抽象产品角色:它是具体产品继承的父类或者是实现的接口,在java中一般有抽象类或者接口来实现。
public interface Car {

    void drive();
}

  1. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
public class Benz implements Car {

    public void drive() {
        System.out.println("Driving Benz");
    }

}

public class Bmw implements Car {

    public void drive() {
        System.out.println("Driving Bmw");
    }
}

抽象工厂模式

抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。比如宝马320系列使用空调A和发动机型号A,而宝马230系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为320系列生产相关配件时,就无需指定配件的型号,它会自动根据车型生产对应的配件型号A。
而且使用抽象工厂模式还要满足以下条件:

  1. 系统中有多个产品族,而系统一次只可能消费其中一族产品。
  2. 同属于同一个产品族的产品一起使用
    抽象工厂模式的各个角色(和工厂方法的一样):
  3. 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
public interface AbstractFactory {

    Engine createEngin();

    AirCondition createAirCondition();
}
  1. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在Java中它由具体的类来实现。
public class FactoryBmw230 implements AbstractFactory {
    public Engine createEngin() {
        return new EnginB();
    }

    public AirCondition createAirCondition() {
        return new AirConditionB();
    }
}

public class FactoryBmw320 implements AbstractFactory {
    public Engine createEngin() {
        return new EnginA();
    }

    public AirCondition createAirCondition() {
        return new AirConditionA();
    }
}
  1. 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象了你或者接口来实现。
public interface Engine {
}

public interface AirCondition {
}

  1. 具体产品角色:具体工厂角色所创建的角色就是此角色的实例。在java中由具体的类来实现
public class EnginA implements Engine {

    public EnginA(){
        System.out.println("制造-->EnginA");
    }

}

public class EnginB implements Engine {

    public EnginB(){
        System.out.println("制造-->EnginB");
    }
}

public class AirConditionA implements AirCondition {

    public AirConditionA(){
        System.out.println("制造-->AirConditionA");
    }
}

public class AirConditionB implements AirCondition {
    
    public AirConditionB(){
        System.out.println("制造-->AirConditionB");
    }
}
上一篇 下一篇

猜你喜欢

热点阅读