我是设计模式的新手。我试图学习一些设计模式。
我在线阅读博客,其中大多数直接告诉我:这是一个简单的工厂,这就是我们使用它的方式。
我理解继承和接口,我使用Java,当然,我在设计系统方面没有很多经验。
我的问题是:如果我们不使用工厂设计模式怎么办?我的意思是,如果我不使用工厂设计模式,有人可以提出一个案例,我会弄得一团糟吗?
答案 0 :(得分:0)
当需要控制所创建对象的生命周期超出使用范围时,工厂模式非常有用。例如,您可以为映像资源创建一个工厂,该工厂返回对多个请求的相同底层资源的引用,以避免昂贵的IO操作。
与大多数模式一样,需要权衡利弊。使用模式来解决您遇到和理解的问题;避免使用预防性模式,因为这通常导致更复杂的代码,这些代码更容易理解并且更容易出错。
答案 1 :(得分:0)
例如,当您需要具有相同参数类型但具有不同行为的多个“构造函数”时,工厂设计模式非常有用。 (这不是唯一的好处)
答案 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