工厂方法模式 :定义一个用于创建对象的接口,让子类决定实现哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂模式的基本组成:
1、抽象工厂
所有具体工厂的父类,规范子类
2、具体工厂
创建某种客户端需要的实现类对象
3、抽象的需要创建对象父类
是根据客户需要创建的对象的父类
4、具体创建对象
客户端需要的实现类对象
还是取简单工厂模式的例子为例
抽象工厂
package factory;
/**
* Created by canon on 2018/11/13.
*/
public interface FruitFactory {
Fruit createFruit();
}
具体工厂
苹果工厂
package factory;
/**
* Created by canon on 2018/11/20.
*/
public class AppleFactory implements FruitFactory {
@Override
public Fruit createFruit() {
return new Apple();
}
}
香蕉工厂
package factory;
/**
* Created by canon on 2018/11/20.
*/
public class BananaFactory implements FruitFactory {
@Override
public Fruit createFruit() {
return new Banana();
}
}
抽象的需要创建对象父类
package factory;
/**
* Created by canon on 2018/11/13.
*/
public interface Fruit {
String getFruitName();
String getFruitColor();
double getFruitWeight();
}
具体创建对象
苹果类
package factory;
/**
* Created by canon on 2018/11/13.
*/
public class Apple implements Fruit {
@Override
public String getFruitName() {
return "苹果";
}
@Override
public String getFruitColor() {
return "红色";
}
@Override
public double getFruitWeight() {
return 0.5;
}
}
香蕉类
package factory;
/**
* Created by canon on 2018/11/13.
*/
public class Banana implements Fruit {
@Override
public String getFruitName() {
return "香蕉";
}
@Override
public String getFruitColor() {
return "黄色";
}
@Override
public double getFruitWeight() {
return 0.5;
}
}
客户点调用
package controller;
import factory.AppleFactory;
import factory.BananaFactory;
import factory.Fruit;
import factory.FruitFactory;
/**
* Created by canon on 2018/11/20.
*/
public class FactoryDesignPattern {
public static void main(String[] args) {
//我需要苹果
FruitFactory fruitFactory = new AppleFactory();
Fruit apple = fruitFactory.createFruit();
System.out.println(apple.getFruitColor());
System.out.println(apple.getFruitName());
System.out.println("------------------------------------");
//我需要香蕉
fruitFactory = new BananaFactory();
Fruit banana = fruitFactory.createFruit();
System.out.println(banana.getFruitName());
System.out.println(banana.getFruitColor());
}
}
输出如下
红色
苹果
------------------------------------
香蕉
黄色
Process finished with exit code 0
创建对象的创建不在交给核心的抽象工厂,而是由具体的工厂类去创建对象。使得原先简单工厂模式由于创建对象需要if。。else。。等的逻辑会带来违背开闭原则的问题得到解决,每当有新的对象需要生成,不需要影响原有的代码,只需要新创一个工厂子类以及新的对象即可。对于客户端,不需要关心具体实现逻辑,只关心调用的接口。当然同样的,也不免有缺点,当新的对象越来越多的时候,相应工厂的类也会越来越多,增加了系统的复杂性。