工厂模式

第二种方式:

package com.dy.xidian;

public class CarFactory {
    
    public static Car createAuDi(){
        return new AuDi();
    }
    
    public static Car createBiYaDi(){
        return new BiYaDi();
    }
}

工厂方法模式


简单工厂中没添加一个新的类就需要去修改原有的工厂代码,这样的有点不好维护。

 为每个具体的类都定义了一个具体的工厂类,当我们有新的类时,只需要增加该类以及其工厂类就可以了。

抽象工厂类:

package com.dy.xidian;

public interface CarFactory {
    public Car createCar();
}

 

 具体工厂类:

package com.dy.xidian;

public class AuDiFactory implements CarFactory {

    @Override
    public Car createCar() {
        return new Audi();
    }

}

 

调用方式:

public class Client{
  Car AuDi = new AuDiFactory.createCar();  
}

 

 如果需要曾加一个大众,那么只需要增加两个类文件DaZhong.java以及DaZhongFactory.java就可以了。但是这样也有个问题,就是每次都要增加两个文件,当类的数量庞大的时候也不好管理,所以一般情况下选用简单工厂模式。

 抽象工厂模式


 简单工厂只能生产一种产品,比如发动机工厂只能生产发动机,轮胎工厂只能生产轮胎,汽车外壳工厂只能生产外壳。如果需要一个由这三种产品构成的一个小汽车的话就无能为力了,这就是设计的到产品族的概念。产品族是多种产品的有机组合,通过抽象工厂方法,我们可以将各个产品组合起来构成一个产品族,而在组合的时候用户可以自行选择各个产品,比如发动机可以选择比较好,而轮胎选择便宜的等等。

 

Engine.java

package com.dy.xidian;

public interface Engine {
    void run();
    void start();
}

class LuxuryEngine implements Engine {

    @Override
    public void run() {
        System.out.println("跑得快");
    }

    @Override
    public void start() {
        System.out.println("启动快");
    }

}

class LowerEngine implements Engine {

    @Override
    public void run() {
        System.out.println("跑得慢");
    }

    @Override
    public void start() {
        System.out.println("启动慢");
    }
}

Seat.java

package com.dy.xidian;

public interface Seat {

    void comfortable();

}

class LuxurySeat implements Seat {

    @Override
    public void comfortable() {
        System.out.println("舒适");
    }
}

class LowerSeat implements Seat {

    @Override
    public void comfortable() {
        System.out.println("不舒适");
    }
}

Shell.java

package com.dy.xidian;

public interface Shell {
    public void meterial();
}

class LuxuryShell implements Shell {

    @Override
    public void meterial() {
        System.out.println("铁的");
    }
}

class LowerShell implements Shell {

    @Override
    public void meterial() {
        System.out.println("塑料的");
    }
}

CarFactory.java

package com.dy.xidian;

public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
    Shell createShell();
}

 

LowerCarFactory.java

package com.dy.xidian;

public class LowerCarFactory implements CarFactory {

    @Override
    public Engine createEngine() {
        return new LowerEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowerSeat();
    }

    @Override
    public Shell createShell() {
        return new LowerShell();
    }
}

LuxuryCarFactory.java

package com.dy.xidian;

public class LowerCarFactory implements CarFactory {

    @Override
    public Engine createEngine() {
        return new LowerEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowerSeat();
    }

    @Override
    public Shell createShell() {
        return new LowerShell();
    }
}

 

MiddleCarFactory.java

package com.dy.xidian;

public class MiddleCarFactory implements CarFactory {

    @Override
    public Engine createEngine() {
        return new LowerEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }

    @Override
    public Shell createShell() {
        return new LowerShell();
    }
}

 

 Client


package com.dy.xidian;

public class Client {

    public static void main(String[] args) {

        CarFactory factory = new LuxuryCarFactory();
        Engine e = factory.createEngine();
        Seat seat = factory.createSeat();
        Shell shell = factory.createShell();
        e.run();
        e.start();
        seat.comfortable();
        shell.meterial();
    }
}

创建一个高档汽车出来

 工厂模式要点


 

简单工厂模式(静态工厂模式)

  • 某种程度不符合设计原则,但实际使用最多

工厂方法模式

  • 不修改已有类的情况下通过增加新的工厂类实现扩展

抽象工厂模式

  • 不可以增加产品,但可以增加产品族

应用场景


JDK中的Calendar的getInstance方法

XML解析时的DocumentBuilerFactory创建解析器对象

反射中Class对象的newInstance()

 

posted @ 2016-06-28 11:01  被罚站的树  阅读(193)  评论(0编辑  收藏  举报