工厂模式分三种:
1.简单工厂模式(静态工厂模式)
package com.yuan;
/**
* @author QLBF
* @version 1.0
* @date 2021/5/23 20:47
*/
abstract class Fruit{
abstract void plant();
}
class Apple extends Fruit{
@Override
void plant() {
System.out.println("种苹果");
}
}
class Banana extends Fruit{
@Override
void plant() {
System.out.println("种香蕉");
}
}
class FruitFactory{
Fruit plant(String fruit){
if (("apple").equals(fruit)){
return new Apple();
}else if (("banana").equals(fruit)){
return new Banana();
}
return null;
}
}
public class SimpleFactoryDemo {
public static void main(String[] args) {
FruitFactory fruitFactory=new FruitFactory();
fruitFactory.plant("banana").plant();
fruitFactory.plant("apple").plant();
}
}
至此我们可以得出:简单工厂模式,可以使得用户无需知道所需产品的创建过程,只需要在意我们需要什么(例如用户只需要知道水果的名字,而不需要知道其内部实现)。但通过上面例子,如果要添加新的水果类需要修改原先工厂类的代码,违背了开闭原则。
2.工厂方法模式
package com.yuan;
/**
* @author QLBF
* @version 1.0
* @date 2021/5/24 14:33
*/
abstract class Fuite{
abstract void plant();
}
class Apple1 extends Fruit{
@Override
void plant() {
System.out.println("苹果");
}
}
class Banana1 extends Fruit{
@Override
void plant() {
System.out.println("西瓜");
}
}
abstract class Fruit1Factory{
abstract Fruit produce();
}
class Apple1FruitFactory extends Fruit1Factory{
@Override
Fruit produce() {
return new Apple1();
}
}
class Banana1FruitFactory extends Fruit1Factory{
@Override
Fruit produce() {
return new Banana1();
}
}
public class FactoryMethodDemo {
public static void main(String[] args) {
Fruit1Factory fruit1Factory=new Apple1FruitFactory();
Fruit apple1 = fruit1Factory.produce();
apple1.plant();
Fruit1Factory fruit1Factory2=new Banana1FruitFactory();
Fruit banana1 = fruit1Factory2.produce();
banana1.plant();
}
}
如果我们需要添加新的水果,那么只要这个水果类extends Fruit,并构建对应水果工厂extends Fruit1Factory就行了。在main方法中,我们是通过创建对应的工厂来创建对应的水果类的(记得工厂定义返回的类型是最大的父类,后面用多态就行)
结论:使用工厂方法模式遵循了开闭原则。但在增加新产品的时候需要增加一个新的工厂和对应的产品类,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
有可能:
超级参考: