一、工厂设计模式

2020-03-30  本文已影响0人  奔跑吧老王

工厂设计模式分为

违背开闭原则,一旦调用处有修改,需要修改的地方较多,且违背开闭原则;

工厂方法

### 抽象水果类
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进行适配模式匹配,可以做到最小粒度的修改。

上一篇 下一篇

猜你喜欢

热点阅读