设计模式----工厂模式

在看工厂模式之前我们先了解一下面相对象的原则。

面向对象设计的基本原则
- OCP开闭原则:一个软件的实体应当对扩展开放,对修改关闭。
- DIP依赖倒转原则:要针对接口编程,不要针对实现编程
- LOD迪米特法则:只与你直接的朋友通信,而避免和陌生人通话。

工厂模式

实现了创建者和调用者的分离,下面我用汽车类的例子来介绍。

详细分类
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式

简单工厂模式

也称之为静态工厂模式,项目开发中通常使用

(下面的例子对比了使用工厂模式和不适用工厂模式的情况)
工厂类:两种方式都可以

//创建一个车工厂类用来创建汽车,这个类里的方法需要是static的
public class CarFactory {

    public static Car createCar(String type) {
        if("奥迪".equals(type)) {
            return new Audi();
        }else if ("比亚迪".equals(type)) {
            return new Byd();
        }else {
            return null;    ///违反了开闭原则
        }
    }
}

另一种方式:

public class CarFactory2 {

    public static Car createAudi() {
        return new Audi();
    }
    public static  Car  createByd() {
        return new Byd();
    }
}

接口

//定义一个车的接口,供各种类型的汽车实现
public interface Car {

    void run();
}

具体实现:

public class Audi implements Car {

    @Override
    public void run() {
        System.out.println("奥迪再跑");
    }

}
public class Byd implements Car{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("byd再跑");
    }

}

客户端测试

/**
 * 不使用工厂模式的情况
 * @author yuan
 *
 */
public class Client01 {

    public static void main(String[] args) {
        Car car= new Audi();
        Car car2 = new Byd();
        car.run();
        car2.run();
    }
}
/**
 * 简单工厂情况下
 * @author yuan
 *
 */

public class Client02 {

    public static void main(String[] args) {
        Car car = CarFactory.createCar("奥迪");
        Car car2 = CarFactory.createCar("比亚迪");

        car.run();
        car2.run();
    }
}

执行结果:

奥迪再跑
byd再跑

简单工厂模式违背了面向对象编程的开闭原则,所以进一步发展就有了咱们下面要介绍的工厂方法模式,其实工厂方法模式在理论上是符合面相编程设计的原则的,但是实用性不如简单工厂模式大,他定义了太多的类和接口,每个具体的车类都需要有一个对应的车工厂,没有简单工厂模式简洁。在实际的开发中,简单工厂模式较为实用。

工厂方法模式

根据设计理论上工厂方法模式占优势,实际上比简单工厂模式要复杂

//创建一个车工厂的接口,来供其他的具体车类实现
public interface CarFactory {

    Car createCar();
}
public interface Car {

    void run();
}
public class Audi implements Car {

    @Override
    public void run() {
        System.out.println("奥迪再跑");

    }

}
public class AudiFactory implements CarFactory{

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

}
public class Benz implements Car{

    @Override
    public void run() {
        // TODO Auto-generated method stub
    System.out.println("奔驰在跑"); 
    }

}
public class BenzFactory implements CarFactory{

    @Override
    public Car createCar() {
        // TODO Auto-generated method stub
        return new Benz();
    }

}
public class Byd implements Car{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("byd再跑");
    }

}
public class BydFactory implements CarFactory {

    @Override
    public Car createCar() {
        // TODO Auto-generated method stub
        return new Byd();
    }

}
public class Client {

    public static void main(String[] args) {
        Car car= new AudiFactory().createCar();
        car.run();

        Car car2 = new BydFactory().createCar();
        car2.run();
    }
}

执行结果:

奥迪再跑
byd再跑

工厂方法模式不修改已有类的前提下,通过增加新的工厂类实现扩展。工厂方法模式在理论上符合面向对象设计的原则,但是带来了类的冗余和拓展,所以实际中不大使用。

下面来看一下最后一种抽象工厂模式,也是最复杂的一种

抽象工厂模式

用来生产不同产品族的全部产品(对于增加新的产品,无能为力,支持增加产品族)

这里写图片描述

//创建车工厂
public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
    Tyre createTyre();
}

创建发动机接口

//
public interface Engine {
void run();
void start();
}
//高端发动机
class LuxuryEngine implements Engine{

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

    }

    @Override
    public void start() {
        // TODO Auto-generated method stub
        System.out.println("启动快,可以自动启停");
    }

}

//高端发动机
class LowEngine implements Engine{

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

    }

    @Override
    public void start() {
        // TODO Auto-generated method stub
        System.out.println("启动慢");
    }

}

创建座椅接口


public interface Seat {

    void massage();
}

class LuxurySeat implements Seat{

    @Override
    public void massage() {
        // TODO Auto-generated method stub
        System.out.println("可以自动按摩");
    }

}

class LowSeat implements Seat{

    @Override
    public void massage() {
        // TODO Auto-generated method stub
        System.out.println("不可以自动按摩");
    }

}

创建轮胎接口

public interface Tyre {

    void revolve();
}

class LuxuryTyre implements Tyre{

    @Override
    public void revolve() {
        // TODO Auto-generated method stub
        System.out.println("旋转不磨损");
    }

}

class LowTyre implements Tyre{

    @Override
    public void revolve() {
        // TODO Auto-generated method stub
        System.out.println("磨损快");
    }
}

低端类工厂


public class LowCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {
        // TODO Auto-generated method stub
        return new LowEngine();
    }

    @Override
    public Seat createSeat() {
        // TODO Auto-generated method stub
        return new LowSeat();
    }

    @Override
    public Tyre createTyre() {
        // TODO Auto-generated method stub
        return new LowTyre();
    }

}

高端类工厂


public class LuxuryCarFactory implements CarFactory {

    @Override
    public Engine createEngine() {
        // TODO Auto-generated method stub
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        // TODO Auto-generated method stub
        return new LuxurySeat();
    }

    @Override
    public Tyre createTyre() {
        // TODO Auto-generated method stub
        return new LuxuryTyre();
    }
}

说一下工厂模式的应用场景
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值