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