设计模式——工厂模式

概念:

假如直接使用new的方式来创建对象,会存在耦合性高的问题,可以新建对象的工厂类,通过工厂类来获取对象,可以降低耦合性。

工厂模式分为三种,分别是

  • 简单工厂模式:允许接口创建对象,但不会暴露对象的创建逻辑。
  • 工厂方法模式:允许接口创建对象,但使用哪个类来创建对象,则是交由子类决定的。
  • 抽象工厂模式:抽象工厂是一个能够创建一系列相关的对象而无需指定/公开其具体类的接口。该模式能够提供其他工厂的对象,在其内部创建其他对象。

1、简单工厂模式

创建接口:

public interface Car {
    public void name();
}

创建接口的实现类:

public class Baoma implements Car{
    @Override
    public void name() {
        System.out.println("宝马!!!");
    }
}
public class Benci implements Car{
    @Override
    public void name() {
        System.out.println("奔驰!!!");
    }
}

创建工厂:

public class CarFactory {

    public static Car getCar(String name){
        Car car=null;
        if (name=="baoma"){
            car=new Baoma();
        }else if(name=="benci"){
            car=new Benci();
        }
        return car;
    }

}

这样就可以通过工厂类去创建对象了

public class client {
    public static void main(String[] args) {
        Car car=CarFactory.getCar("baoma");
        car.name();
        Car car1=CarFactory.getCar("benci");
        car1.name();
    }
}

2、工厂方法模式

上述简单工厂模式虽然降低了耦合,但是当需要新增车辆时,就需要修改工厂类,违反了设计模式中的开闭原则(对修改关闭,对拓展开放)。

创建接口:

public interface Car {
    public void name();
}

创建接口的实现类:

public class Baoma implements Car{
    @Override
    public void name() {
        System.out.println("宝马!!!");
    }
}
public class Benci implements Car{
    @Override
    public void name() {
        System.out.println("奔驰!!!");
    }
}

创建工厂接口:

public interface CarFactory {
    public Car getCar();
}

创建工厂接口实现类:

public class BaomaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Baoma();
    }
}
public class BenciFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Benci();
    }
}

编写测试类:

public class client {
    public static void main(String[] args) {
        Car car=new BaomaFactory().getCar();
        car.name();
        Car car1=new BenciFactory().getCar();
        car1.name();
    }
}

 工厂方法模式符合开闭原则,当需要新增车辆时,不需要改动代码,只需要在其基础上新增车辆的实现类和工厂实现类。但每次都需要去新建实现类,就容易发生类爆炸。

3、抽象工厂模式

新建接口:

public interface iphone {
     public void call();
}
public interface router {
    public void openWifi();
}

创建接口实现类:

public class huaweiPhone implements iphone{
    @Override
    public void call() {
        System.out.println("华为手机打电话!!");
    }
}
public class xiaomiPhone implements iphone{
    @Override
    public void call() {
        System.out.println("小米手机打电话!!");
    }
}
public class huaweiRouter implements router{
    @Override
    public void openWifi() {
        System.out.println("华为路由器开wifi");
    }
}
public class xiaomiRouter implements router{
    @Override
    public void openWifi() {
        System.out.println("小米路由器开wifi");
    }
}

新建工厂接口:

public interface factory {
    public iphone createPhone();

    public router createRouter();
}

创建工厂实现类:

public class huaweiFactory implements factory{
    @Override
    public iphone createPhone() {
        return new huaweiPhone();
    }

    @Override
    public router createRouter() {
        return new huaweiRouter();
    }
}
public class xiaomiFactory implements factory{
    @Override
    public iphone createPhone() {
        return new xiaomiPhone();
    }

    @Override
    public router createRouter() {
        return new xiaomiRouter();
    }
}

新建测试类:

public class client {
    public static void main(String[] args) {
        iphone iphone = new xiaomiFactory().createPhone();
        iphone.call();

        iphone iphone1=new huaweiFactory().createPhone();
        iphone1.call();

        router router=new xiaomiFactory().createRouter();
        router.openWifi();

        router router1=new huaweiFactory().createRouter();
        router1.openWifi();


    }
}

 类图

抽象工厂模式也不符合设计模式中的开闭原则,当需要添加一个新产品时,比如说添加一个笔记本,则需要去修改工厂接口和产品接口。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值