Design patterns 如果我们不使用工厂设计模式呢?

Design patterns 如果我们不使用工厂设计模式呢?,design-patterns,Design Patterns,我是设计图案的新手。我正在努力学习一些设计模式 我在网上读博客,大多数博客都直接告诉我:这是一个简单的工厂,我们就是这样使用它的 我了解继承和接口,我使用Java,当然,我在设计系统方面没有太多经验 我的问题是:如果我们不使用工厂设计模式怎么办?我的意思是,如果我不使用工厂设计模式,有人能给我一个我会把自己弄得一团糟的例子吗 当所创建对象的生命周期需要控制在使用范围之外时,factory模式非常有用。例如,您可以为映像资源创建一个工厂,该工厂为多个请求返回对同一底层资源的引用,以避免昂贵的IO操

我是设计图案的新手。我正在努力学习一些设计模式

我在网上读博客,大多数博客都直接告诉我:这是一个简单的工厂,我们就是这样使用它的

我了解继承和接口,我使用Java,当然,我在设计系统方面没有太多经验


我的问题是:如果我们不使用工厂设计模式怎么办?我的意思是,如果我不使用工厂设计模式,有人能给我一个我会把自己弄得一团糟的例子吗

当所创建对象的生命周期需要控制在使用范围之外时,factory模式非常有用。例如,您可以为映像资源创建一个工厂,该工厂为多个请求返回对同一底层资源的引用,以避免昂贵的IO操作


与大多数模式一样,存在权衡。使用模式解决您遇到和理解的问题;避免预防性地使用模式,因为这通常会导致更复杂的代码,更难理解,更容易出现错误。

例如,当您需要多个具有相同参数类型但行为不同的构造函数时,factory design模式非常有用。这不是唯一的好处


你可以看看这个问题

在线上有大量教程介绍简单工厂。很少有人解释这个问题:“如果我不想使用简单的工厂设计模式怎么办?”

我会告诉你,如果你不使用简单的工厂设计模式。比如说,我很富有,我拥有一个汽车仓库,在那里我有宝马、奥迪、奔驰等等

当我想驾驶宝马时,我可以从发动机中选择:V4、V6和V8。我也可以选择领带,18号、19号和20号。等等几乎每次我想开车的时候,我都可以定制我的车。比方说,在这种情况下,我只关心引擎。通常,我必须指定发动机,如:“BMWV4-v2.0-1058”,这是一个V4发动机,2.0升,识别号1058。我有一个级别的车,宝马、奥迪和奔驰是这辆车的延伸。以下是我的车:

//Define the parent class. When we Init a Car, we need to specify the engine.
public class Car {
    protected String engine = null;
    
    public Car(){
        
    }
    
    public Car(String engine){
        this.engine = engine;
    }
    
    public void drive() {
        System.out.print("Driving Car with engine: "+this.engine);
    }
}
 
//Those are the implementation of cars
class BMW extends Car{
 
    public BMW(String engine){
        super.engine = engine;
    }
 
    @Override
    public void drive() {
        System.out.println("Driving BWM with engine: "+super.engine);    
    }
    
}
class Audi extends Car{
 
    public Audi(String engine){
        super.engine = engine;
    }
 
    @Override
    public void drive() {
        System.out.println("Driving Audi with engine: "+super.engine);    
    }
    
}
class Benz extends Car{
 
    public Benz(String engine){
        super.engine = engine;
    }
 
    @Override
    public void drive() {
        System.out.println("Driving Benz with engine: "+super.engine);    
    }
    
}
正如我们所看到的,汽车的构造将采用发动机类型。现在,我想驾驶: //这就是我,我很有钱,我想开车

public class RichMan {
    public static void main(String[] args){
        //Monday, drive my BMW. Oh Yeah~
        Car MondayCar = new BMW("BMWV4-v2.0-1058");
        MondayCar.drive();
        //Tuseday, drive the Benz
        Car TuesdayCar = new Benz("BenzV6-v2.5-4315");
        TuesdayCar.drive();
        //Wed, drive the Audi, Let's roll
        Car WedCar = new Audi("AudiV8-v3.0-3513-supercharged");
        WedCar.drive();
    }
}
每件事看起来都很好。但问题是:我必须记住我的引擎的名字。有时候,记住它们并不容易。想象一下我是超级富有的人,拥有大量的汽车。 如果我们不使用工厂模式,这正是问题所在:我们需要了解每一辆汽车。我们必须了解制造汽车的一切

为了解决这个问题,我决定雇佣一个人在我的汽车仓库工作。现在整个汽车仓库都是一个工厂。工厂确切地知道发动机是什么。每天,工厂都会把我想要的汽车准备好

public class MyCarFactory {
    private Car myCar;

    //Now, My factory will remember all the engine type
    public MyCarFactory(String car){
        if(car.equals("BMW")){
            this.setMyCar(new BMW("BMWV4-v2.0-1058"));
        }
        else if(car.endsWith("Benz")){
            this.setMyCar(new Benz("BenzV6-v2.5-4315"));
        }
        else{
            this.setMyCar(new Audi("AudiV8-v3.0-3513-supercharged"));
        }
        /*
         * Here, in the future, if I have more cars, I can add them here,
         * If new upgrade of engine, I can change the engine here.
         * I can even hire someone to work in this factory and do all the things for me.
         * At any memont, as a rich man, I only drive, no need to know details.
         */
    }

    public Car getMyCar() {
        return myCar;
    }

    public void setMyCar(Car myCar) {
        this.myCar = myCar;
    }
}
现在,对我来说,作为一个富人,我只需要做:

//This is me, I'm rich and I want to drive my cars.
public class RichMan {
    public static void main(String[] args){
        //Monday, drive my BMW. Oh Yeah~
        Car MondayCar = new BMW("BMWV4-v2.0-1058");
        MondayCar.drive();
        //Tuseday, drive the Benz
        Car TuesdayCar = new Benz("BenzV6-v2.5-4315");
        TuesdayCar.drive();
        //Wed, drive the Audi, Let's roll
        Car WedCar = new Audi("AudiV8-v3.0-3513-supercharged");
        WedCar.drive();

        //Thursday, I don't need to remember any of my car's engine type.
        Car ThursdayCar = new MyCarFactory("Audi").getMyCar();
        ThursdayCar.drive();
    }

}

就是这样。这就是我的想法。我他妈的很富有,我不想记住所有让我的爱车准备好驾驶的细节。我的工厂会处理好它,我只需要驾驶。干杯~-在我的博客上看到更多信息:

这个问题似乎离题了,因为它不是关于你所面临的真实的编码问题。@jmort253.我在谷歌上搜索了很多博客,他们总是从如何使用开始,而不是告诉我们如果我们不使用它会有多糟糕……欢迎来到StackOverflow。模式是开发人员的工具箱,所以很多时候工厂模式不是最佳解决方案。重要的是你要掌握不同的模式le,所以你可以选择最合适的模式。随着你所使用的系统的发展,模式变得越来越有用,因此很难有人给你一个好的答案。@谢谢。你可能是对的,学习需要时间。。。