简单工厂,工厂方法,抽象工厂模式

本文详细介绍了软件设计的七大原则,并通过实例展示了简单工厂、工厂方法和抽象工厂模式的应用。简单工厂符合单一职责原则,提高代码灵活性;工厂方法遵循开闭原则,允许扩展而不修改;抽象工厂则提供了创建一系列相关对象的接口。三种模式各有优劣,适用于不同的场景需求。
摘要由CSDN通过智能技术生成

简单工厂,工厂方法,抽象工厂模式

软件设计七大原则

开闭原则对扩展开放,对修改关闭降低维护带来的新风险
依赖倒置原则高层不应该依赖低层,要面向接口编程更利于代码结构的升级扩展
单一职责原则一个类只干一件事,实现类要单一便于理解,提高代码的可读性
接口隔离原则一个接口只干一件事,接口要精简单一功能解耦,高聚合、低耦合
迪米特法则不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度只和朋友交流,不和陌生人说话,减少代码臃肿
里氏替换原则不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义防止继承泛滥
合成复用原则尽量使用组合或者聚合关系实现代码复用,少使用继承降低代码耦合

简单工厂模式:

1.定义:简单来说就是在实例化对象的时候不在使用new Object()这个形式,而是3可以根据用户的选择条件来 实例化相对应需要的类。对于客户端来说,去除了具体类的相关依赖。只需要给出具体的实例给工厂,工厂就会自动返回具体的实例对象。

 

在创建车型的时候我们一共有三种选择的车型:Hongqi,Biyadi,Benz,各自可以生产:红旗,比亚迪,奔驰。我们创建有个工厂类来根据用户输入的车型,创建其相对应的类:

汽车类

public interface Car {
    void createCar();
}
​

具体车型实现Car接口

public class HongqiCar implements Car {
    @Override
    public void createCar() {
        System.out.println("生产红旗");
    }
}
​
public class BenzCar implements  Car{
    @Override
    public void createCar() {
        System.out.println("生产奔驰");
    }
}
​
public class BiyadiCar implements Car{
    @Override
    public void createCar() {
        System.out.println("生产比亚迪");
​
    }
}
​
 

创建工厂类:

public class CarFactor {
​
    public Car createModel(String model){
        Car car=null;
        switch (model){
            case "比亚迪":
                car=new BiyadiCar();
            case "红旗":
                car=new HongqiCar();
            case "奔驰":
                car=new BenzCar();
        }
        return  car;
    }
​
}
​

测试:

public class test {
​
    public static void main(String[] args) {
        CarFactor carFactor = new CarFactor();
        Car car = carFactor.createModel("比亚迪");
        car.createCar();
    }
​
​
}
​
输出:生产比亚迪

总结:简单工厂符合单一原则,用牺牲开闭的 方式来提高灵活性。

工厂方法模式(Factory Method):

1.定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。

 

//创建工厂接口CarFactory:

public interface CarFactory {
    Car createCarFactory();
}
​

//创建具体类型的工厂:

public class BenzFactory implements CarFactory {
    @Override
    public Car createCarFactory() {
        return new BiyadiCar();
    }
}
​
public class BiyadiFactory implements CarFactory{
    @Override
    public Car createCarFactory() {
        return new BiyadiCar();
    }
}
​
public class HongqiFactory implements CarFactory{
    @Override
    public Car createCarFactory() {
        return new HongqiCar();
    }
}
​
​

//测试

    public static void main(String[] args) {
        HongqiFactory hongqiFactory = new HongqiFactory();
        Car carFactory = hongqiFactory.createCarFactory();
        carFactory.createCar();
    }
​
​
​
}
//输出:生产比亚迪

总结:用户只需要知道具体工厂的名字,就可以得到想要的产品。

其满足单一原则,开闭原则,但是灵活性较差。

抽象工厂模式(Abstract Factory):

1.定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们

//创建电车,油车,混能车的抽象接口

public interface ECar {
    void createCar();
}
​
public interface HCar {
    void createCar();
}
​
public interface OCar {
    void createCar();
}
​

//创建具体品牌车型的具体类(其他车型以此类推)

public class BenZECar implements ECar{
    @Override
    public void createCar() {
        System.out.println("奔驰电车");
    }
}
​
public class BenZHCar implements HCar{
    @Override
    public void createCar() {
        System.out.println("奔驰混合车");
    }
}
​
public class BenZOCar implements OCar {
​
    @Override
    public void createCar() {
        System.out.println("奔驰油车");
    }
​
}
​

//创建抽象车型工厂接口

public interface CarFactory {
    ECar createEcar();
     OCar createOcar();
     HCar createHcar();
}
​


//创建具体品牌的工厂实现接口工厂CarFactory(其他品牌以此类推)

public class BenZFactory implements CarFactory {
​
    @Override
    public ECar createEcar() {
        return new BenZECar();
    }
​
    @Override
    public OCar createOcar() {
        return new BenZOCar();
    }
​
    @Override
    public HCar createHcar() {
        return new BenZHCar();
    }
}

//测试

public class test {
​
    public static void main(String[] args) {
        BenZFactory benZFactory = new BenZFactory();
        HCar hcar = benZFactory.createHcar();
        hcar.createCar();
    }
}

总结:抽象方法符合单一原则,开闭原则,但是灵活性差

抽象工厂--简单抽象工厂

将工厂类替换为:

public class SimpleAbstractCatFactory {
    public ECar createECars(String brand ){
​
        Ecar ecar = null;
        switch (brand) {
            case "比亚迪":
                ecar = new BIyadiEcar();
                break;
            case "红旗":
                ecar = new HongqiEcar();
                break;
            case "奔驰":
                ecar = new BenZEcar();
                break;
        }
        return ecar;
    }
​}

总结:抽象方法符合单一原则,不符合开闭原则,但是灵活性高

工厂模式小结

工厂方法模式与抽象工厂模式的区别在于:

(1)工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。

(2)抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值