工厂设计模式分为
- 简单工厂
- 工厂方法
- 抽象工厂
简单工厂
违背开闭原则,一旦调用处有修改,需要修改的地方较多,且违背开闭原则;
工厂方法
### 抽象水果类
public abstract class Fruit {
private String name;
abstract String placeOfOrign(String orign);
public void fruitName(){
System.out.println(name);
}
public void desc(){
System.out.println(name +"是圆的!!!");
}
}
### 具体实现类
public class ShanDongApple extends Fruit {
@Override
String placeOfOrign(String origin) {
super.setName("山东苹果");
return this.getName();
}
}
### 具体实现类
public class ShanDongPear extends Fruit {
@Override
String placeOfOrign(String origin) {
super.setName("山东梨");
return this.getName();
}
}
### 具体实现类
public class BeiJingApple extends Fruit {
@Override
String placeOfOrign(String origin) {
super.setName("北京苹果");
return this.getName();
}
}
### 具体实现类
public class BeiJingPear extends Fruit {
@Override
String placeOfOrign(String origin) {
super.setName("北京梨");
return this.getName();
}
}
### 子类工厂类
public class BeiJingFruit extends FruitFactory {
private String typeName;
@Override
Fruit creatFruit() {
Fruit fruit=null;
if("apple".equals(typeName)){
fruit = new BeiJingApple();
}else {
fruit = new BeiJingPear();
}
return fruit;
}
}
### 子类工厂类
public class ShanDongFruit extends FruitFactory {
private String typeName;
@Override
Fruit creatFruit() {
Fruit fruit=null;
if("apple".equals(typeName)){
fruit = new ShanDongApple();
fruit.setName(typeName);
}else {
fruit = new ShanDongPear();
fruit.setName(typeName);
}
return fruit;
}
}
###工厂顶级类
public abstract class FruitFactory {
abstract Fruit creatFruit();
public void sellerFruit(){
Fruit fruit = creatFruit();
fruit.fruitName();
fruit.desc();
}
}
### 调用处
public class FruitShop {
public static void main(String[] args) {
ShanDongFruit shanDongFruit = new ShanDongFruit();
shanDongFruit.setTypeName("hhh");
shanDongFruit.sellerFruit();
}
}
类图:
image.png对工厂方法进行简要分析:
在调用处可能有多处调用,如果需要增加一个水果种类的话,不采用工厂方法模式,需要在调用处进行多处修改,且存在漏该的可能性,采用工厂方法只需要修改子类工厂即可,根据TypeName进行适配模式匹配,可以做到最小粒度的修改。
网友评论