如果我们不使用工厂设计模式怎么办?

时间:2014-02-23 06:18:35

标签: design-patterns

我是设计模式的新手。我试图学习一些设计模式。

我在线阅读博客,其中大多数直接告诉我:这是一个简单的工厂,这就是我们使用它的方式。

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

我的问题是:如果我们不使用工厂设计模式怎么办?我的意思是,如果我不使用工厂设计模式,有人可以提出一个案例,我会弄得一团糟吗?

3 个答案:

答案 0 :(得分:0)

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

与大多数模式一样,需要权衡利弊。使用模式来解决您遇到和理解的问题;避免使用预防性模式,因为这通常导致更复杂的代码,这些代码更容易理解并且更容易出错。

答案 1 :(得分:0)

例如,当您需要具有相同参数类型但具有不同行为的多个“构造函数”时,工厂设计模式非常有用。 (这不是唯一的好处)

您可以查看此问题Factory Pattern. When to use factory methods?

答案 2 :(得分:0)

有很多在线教程解释简单的工厂。他们中很少有人解释这个问题:“如果我不想使用简单的工厂设计模式怎么办”。

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

当我想驾驶宝马时,我可以选择发动机:V4,V6和V8。我也可以选择18英寸,19英寸和20英寸的领带。等等。几乎每次我想开车,我都可以自定义我的车。让我们说,在这种情况下,我只关心引擎。通常情况下,我必须指定发动机:“BMWV4-v2.0-1058”,这是一款V4发动机,2.0L和识别号码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();
    }

}

就是这样。这是个主意。我真该死,我不想记住让我的豪华轿车准备开车的所有细节。我的工厂会照顾它,我只需要开车。干杯〜 - 在我的博客上查看更多内容:Why we use simple factory design pattern? Reasons and examples