设计模式:可复用面向对象软件基础 第三章(1)

这本书没有办法划重点,每一句话都让人觉得精彩,适合反复阅读,下面说些自己的理解。

网上很多文章认为 Factory Method 与 Abstract Factory 之间的区别在于,后者在一个工厂中实现了一类 Factory Method,而我认为其中有着重点的不同, Abstract Factory 强调产品的特异性(如车窗与车门之间的特异性,是车的不同组件),而 Factory Method 强调产品的统一性(如法拉利与玛莎拉蒂之间的统一性,都是车么)。

Builder 与 Factory 之间的差别在于 Builder 是生产组件,然后由Director组装组件,而 Factory 是生产产品。

Abstract Factory适用于工厂中产出的产品虽然有关,但不是一类物品,比如代码中车窗和车门,这两者可以包含于一个Abstract Factory中,而对于不同的工厂,产出的同类产品应该实现一个接口

public class AbstractFactory {
    public static void main(String[] args) {
        CarFactory carFactory = BenzCarFactory.getFactory();
        carFactory.makeCarDoor().print();
        carFactory.makeCarWindow().print();

        carFactory = FerrariFactory.getFactory();
        carFactory.makeCarDoor().print();
        carFactory.makeCarWindow().print();
    }
}

interface CarFactory {
    CarWindow makeCarWindow();
    CarDoor makeCarDoor();
}

class BenzCarFactory implements CarFactory {
    private BenzCarFactory() {}

    @Override
    public CarWindow makeCarWindow() {
        return new BenzCarWindow();
    }

    @Override
    public CarDoor makeCarDoor() {
        return new BenzCarDoor();
    }

    public static BenzCarFactory getFactory() {
        return factory;
    }

    private static final BenzCarFactory factory = new BenzCarFactory();
}

class FerrariFactory implements CarFactory {
    private FerrariFactory() {}

    @Override
    public CarWindow makeCarWindow() {
        return new FerrariCarWindow();
    }

    @Override
    public CarDoor makeCarDoor() {
        return new FerrariCarDoor();
    }

    public static FerrariFactory getFactory() {
        return factory;
    }

    private static final FerrariFactory factory = new FerrariFactory();
}

interface CarWindow {
    void print();
}

interface CarDoor {
    void print();
}

class BenzCarWindow implements CarWindow {
    @Override
    public void print() {
        System.out.println("BenzCarWindow");
    }
}

class BenzCarDoor implements CarDoor {
    @Override
    public void print() {
        System.out.println("BenzCarDoor");
    }
}

class FerrariCarWindow implements CarWindow {
    @Override
    public void print() {
        System.out.println("FerrariCarWindow");
    }
}

class FerrariCarDoor implements CarDoor {
    @Override
    public void print() {
        System.out.println("FerrariCarDoor");
    }
}

 

Factory Method 产出的所有产品实现同一接口,他们之间是统一的。

public class FactoryMethod {
    public static void main(String[] args) {
        CarFactory factory = BenzFactory.getFactory();
        factory.make().print();

        factory = FerrariFactory.getFactory();
        factory.make().print();

        factory = MaseratiFactory.getFactory();
        factory.make().print();
    }
}

interface CarFactory {
    Cars make();
}

class BenzFactory implements CarFactory {
    private BenzFactory() {}

    @Override
    public Cars make() {
        return new Benz();
    }

    public static BenzFactory getFactory() {
        return factory;
    }

    private static final BenzFactory factory = new BenzFactory();
}

class FerrariFactory implements CarFactory {
    private FerrariFactory() {}

    @Override
    public Cars make() {
        return new Ferrari();
    }

    public static FerrariFactory getFactory() {
        return factory;
    }

    private static final FerrariFactory factory = new FerrariFactory();
}

class MaseratiFactory implements CarFactory {
    private MaseratiFactory() {}

    @Override
    public Cars make() {
        return new Maserati();
    }

    public static MaseratiFactory getFactory() {
        return factory;
    }

    private static final MaseratiFactory factory = new MaseratiFactory();
}

public interface Cars {
    void print();
}

class Benz implements Cars {
    @Override
    public void print() {
        System.out.println("Benz");
    }
}

class Ferrari implements Cars {
    @Override
    public void print() {
        System.out.println("Ferrari");
    }
}

class Maserati implements Cars {
    @Override
    public void print() {
        System.out.println("Maserati");
    }
}

Builder:

import java.util.LinkedList;
import java.util.List;

public class Builder {
    public static void main(String[] args) {
        Director director = new Director(new HighPriceBuilder());
        director.build();
        for (Parts parts: director.getProduct())
            parts.print();

        director = new Director(new LowPriceBuilder());
        director.build();
        for (Parts parts: director.getProduct())
            parts.print();
    }
}

class CarBuilder {
    void makeDoor() {}
    void makeWindow() {}
    void makeDecoration() {}
    void addIn(Parts parts) {
        partsList.add(parts);
    }

    List<Parts> partsList = new LinkedList<>();
}

class HighPriceBuilder extends CarBuilder {
    @Override
    void makeDoor() {
        addIn(new HighPriceDoor());
    }

    @Override
    void makeWindow() {
        addIn(new HighPriceWindow());
    }

    @Override
    void makeDecoration() {
        addIn(new Decoration());
    }
}

class LowPriceBuilder extends CarBuilder {
    @Override
    void makeDoor() {
        addIn(new LowPriceDoor());
    }

    @Override
    void makeWindow() {
        addIn(new LowPriceWindow());
    }
}

public interface Parts {
    void print();
}

class HighPriceWindow implements Parts {

    @Override
    public void print() {
        System.out.println("HighPriceWindow");
    }
}

class LowPriceWindow implements Parts {

    @Override
    public void print() {
        System.out.println("LowPriceWindow");
    }
}

class HighPriceDoor implements Parts {

    @Override
    public void print() {
        System.out.println("HighPriceDoor");
    }
}

class LowPriceDoor implements Parts {

    @Override
    public void print() {
        System.out.println("LowPriceDoor");
    }
}

class Decoration implements Parts {

    @Override
    public void print() {
        System.out.println("HighPriceDecoration");
    }
}

import java.util.List;

public class Director {
    Director(CarBuilder c) {
        carBuilder = c;
    }

    void build() {
        carBuilder.makeDecoration();
        carBuilder.makeDoor();
        carBuilder.makeWindow();
        carBuilder.makeWindow();
    }

    List<Parts> getProduct() {return carBuilder.partsList; }

    CarBuilder carBuilder;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值