Java设计模式之--------创建者模式之--------工厂模式之--------工厂方法模式

创建者模式分为:

创建型模式的主要关注点是"怎样创建对象? ”,它的主要特点是"将对象的创建与使用分离”。

这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。


*工厂模式的解说:
在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道乱可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是: 解耦

1、工厂方法模式

针对简单工厂模式中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。

1.1、概念

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

1.2、结构

工厂方法模式的主要角色:

  • 抽象工厂(Abstract Factory)∶提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂(ConcreteFactory)︰主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product)︰定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(ConcreteProduct)∶实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间—一对应。

1.3、实现

具体产品(ConcreteProduct)∶实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
Java设计模式之--------创建者模式之--------工厂模式之--------工厂方法模式
抽象工厂代码

public interface CoffeeFactory {

    //创建咖啡对象方法
    Coffee createCoffee();
}

美式咖啡类工厂代码

public class AmericanFactory implements CoffeeFactory{ //专门用来生产美式咖啡的工厂
	@Override
    public Coffee createCoffee(){
        return new AmericanCoffee();
    }
}

拿铁咖啡类工厂代码

public class LatteCoffeeFactory implements CoffeeFactory{ //专门用来生产拿铁咖啡的工厂
    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
}

咖啡商店代码

public class CoffeeStore {
    private CoffeeFactory factory;

    public void setFactory(CoffeeFactory factory) {
        this.factory = factory;
    }

    //点咖啡功能
    public Coffee oderCoffee() {
        //生产咖啡
        Coffee coffee = factory.createCoffee();

        //加配料
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }

}

咖啡类代码

public abstract class Coffee {
    //创建抽象方法,供子类重写
    public abstract String getName();

    //加糖
    public void addSugar(){
        System.out.println("加糖");
    }

    //加奶
    public void addMilk(){
        System.out.println("加奶");
    }
}

美式咖啡代码

public class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }
}

拿铁咖啡代码

public class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

客户代码

public class Client {
    public static void main(String[] args) {
        //创建咖啡商店对象
        CoffeeStore story = new CoffeeStore();

        //创建相应的咖啡工厂对象
        CoffeeFactory factory = new AmericanFactory();

        //用这个具体咖啡工厂对象来生产具体的咖啡
        story.setFactory(factory);

        Coffee coffee = story.oderCoffee();

        System.out.println(coffee.getName());
    }
}

从以上的编写的代码可以看到,要增加产品类时也要相应地增加工厂类,不需要修改工厂类的代码了,这样就解决了简单工厂模式的缺点。

工厂方法模式是简单工厂模式的进一步抽象。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

1.4、优缺点

优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
上一篇:模式扩展——简单工厂加配置文件


下一篇:QT解决undefined reference to vtable的万能办法