รูปแบบการออกแบบ: โรงงานกับวิธีการของโรงงานเทียบกับบทคัดย่อจากโรงงาน


183

ฉันอ่านรูปแบบการออกแบบจากเว็บไซต์

มีฉันอ่านเกี่ยวกับโรงงานวิธีการโรงงานและโรงงานนามธรรม แต่พวกเขาสับสนดังนั้นไม่ชัดเจนในคำจำกัดความ ตามคำจำกัดความ

Factory - สร้างวัตถุโดยไม่ต้องเปิดเผยเหตุผลของการสร้างอินสแตนซ์ไปยังไคลเอนต์และอ้างถึงวัตถุที่สร้างขึ้นใหม่ผ่านทางอินเตอร์เฟสทั่วไป เป็นวิธีการที่ง่ายจากเวอร์ชันโรงงาน

วิธีการจากโรงงาน - กำหนดอินเทอร์เฟซสำหรับการสร้างวัตถุ แต่ให้คลาสย่อยเพื่อตัดสินใจว่าคลาสใดที่จะสร้างอินสแตนซ์และอ้างถึงวัตถุที่สร้างขึ้นใหม่ผ่านอินเทอร์เฟซทั่วไป

Abstract Factory - เสนออินเทอร์เฟซสำหรับสร้างตระกูลของวัตถุที่เกี่ยวข้องโดยไม่ต้องระบุคลาสของพวกเขาอย่างชัดเจน

ฉันยังดูเธรดสแต็คโฟลว์อื่น ๆ ที่เกี่ยวข้องกับ Abstract Factory กับ Factory Factory แต่ไดอะแกรม UML ที่นั่นทำให้ฉันเข้าใจยิ่งขึ้น

ใครช่วยบอกหน่อยได้ไหม

  1. รูปแบบทั้งสามนี้แตกต่างกันอย่างไร
  2. จะใช้เมื่อใด
  3. และถ้าเป็นไปได้ตัวอย่าง Java ใด ๆ ที่เกี่ยวข้องกับรูปแบบเหล่านี้?

3
ในขณะที่ผมกำลังมองหาคำตอบให้กับคำถามประมาณเดียวกับ OP ผมพบว่าบทความนี้: จากไม่มีโรงงานที่วิธีที่โรงงาน มันให้ข้อมูลเชิงลึกโดยทำตามวิวัฒนาการของโครงการตัวอย่าง (วิธีการโรงงานที่กล่าวถึงในชื่อเป็นหนึ่งในขั้นตอนวิวัฒนาการ)
Nick Alexeev

คำตอบ:


251

ทั้งสามประเภทของโรงงานทำในสิ่งเดียวกัน: เป็น "ตัวสร้างอัจฉริยะ"

สมมติว่าคุณต้องการสร้างผลไม้สองชนิด: Apple และ Orange

โรงงาน

โรงงานคือ "คงที่" ซึ่งคุณมีเพียงการนำไปใช้งานเพียงครั้งเดียวโดยไม่มีคลาสย่อย ในกรณีนี้คุณจะมีคลาสดังนี้:

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

ใช้กรณี: การสร้างแอปเปิ้ลหรือส้มเป็นบิตที่ซับซ้อนเกินไปที่จะจัดการในตัวสร้างสำหรับทั้ง

วิธีการโรงงาน

โดยทั่วไปแล้ววิธีการใช้งานจากโรงงานเมื่อคุณมีการประมวลผลทั่วไปในคลาส แต่ต้องการเปลี่ยนชนิดของผลไม้ที่คุณใช้จริง ดังนั้น:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }
}

... จากนั้นคุณสามารถนำการใช้งานทั่วไปกลับมาใช้ใหม่ได้FruitPicker.pickFruit()โดยการใช้วิธีการจากโรงงานในคลาสย่อย:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

โรงงานบทคัดย่อ

โดยทั่วไปแล้วบทคัดย่อของโรงงานจะใช้สำหรับสิ่งต่าง ๆ เช่นการฉีด / กลยุทธ์ขึ้นอยู่กับว่าเมื่อคุณต้องการสร้างวัตถุทั้งครอบครัวที่ต้องมี "ชนิดเดียวกัน" และมีคลาสพื้นฐานบางส่วน นี่เป็นตัวอย่างที่เกี่ยวข้องกับผลไม้ กรณีการใช้ที่นี่คือเราต้องการให้แน่ใจว่าเราไม่ได้ใช้ OrangePicker บน Apple ตราบใดที่เราได้รับผลไม้และตัวเลือกจากโรงงานเดียวกันพวกเขาจะจับคู่

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); 

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}

8
+1 นี่คือคำตอบที่เหมือนกันที่สุดกับความเข้าใจของฉันเกี่ยวกับรูปแบบเหล่านี้ การเพิ่มตัวอย่างรหัสโทร (ลูกค้า) จะช่วยได้เช่นกัน? คำถามที่ทำให้ฉันรำคาญมากคือ: เราสามารถพูดได้หรือไม่ว่ารูปแบบนามธรรมจากโรงงานเป็นเพียงรูปแบบโรงงานที่ขยายด้วยรูปแบบวิธีการของโรงงาน (ถ้าเป็นจริงฉันชัดเจนในหัวข้อนี้)
croraf

9
นี่คือตัวอย่างที่ฉันใช้เวลาหลายปีในการมองหา
Taztingo

นั่นเป็นคำอธิบายที่น่าอัศจรรย์! ขอบคุณ!
André Andrade

@ AndréAndradeวิธีการเรียกใช้วิธีการจากโรงงาน ? กรุณาใช้รหัสขนาดเล็ก :) ซึ่งจะทำให้ฉันสงสัยในการใช้งาน
Arnab Dutta

25
  1. รูปแบบทั้งสามนี้แตกต่างกันอย่างไร

โรงงาน:สร้างวัตถุโดยไม่ต้องเปิดเผยตรรกะการสร้างอินสแตนซ์ให้กับลูกค้า

วิธีการจากโรงงาน:กำหนดอินเทอร์เฟซสำหรับการสร้างวัตถุ แต่ให้คลาสย่อยตัดสินใจว่าคลาสใดจะสร้างอินสแตนซ์ เมธอด Factory อนุญาตให้คลาสเลื่อนการอินสแตนซ์ไปที่คลาสย่อย

บทคัดย่อจากโรงงาน:เป็นอินเทอร์เฟซสำหรับการสร้างตระกูลของวัตถุที่เกี่ยวข้องหรือขึ้นอยู่กับโดยไม่ต้องระบุคลาสที่เป็นรูปธรรม

รูปแบบAbstractFactoryใช้การจัดองค์ประกอบเพื่อมอบหมายความรับผิดชอบในการสร้างวัตถุไปยังคลาสอื่นในขณะที่รูปแบบการออกแบบวิธีโรงงานใช้การสืบทอดและอาศัยคลาสที่ได้รับหรือคลาสย่อยเพื่อสร้างวัตถุ

  1. จะใช้เมื่อใด

โรงงาน:ลูกค้าเพียงแค่ต้องการชั้นเรียนและไม่สนใจว่าจะมีการติดตั้งที่เป็นรูปธรรมหรือไม่

วิธีการจากโรงงาน:ลูกค้าไม่ทราบว่าจะต้องสร้างคลาสที่เป็นรูปธรรมในขณะทำงาน แต่เพียงแค่ต้องการได้รับคลาสที่จะทำงานได้

AbstactFactory: เมื่อระบบของคุณต้องสร้างหลายตระกูลของผลิตภัณฑ์หรือคุณต้องการจัดหาไลบรารีของผลิตภัณฑ์โดยไม่ต้องเปิดเผยรายละเอียดการใช้งาน

บทคัดย่อคลาสของโรงงานมักถูกนำไปใช้กับวิธีการของโรงงาน โดยทั่วไปแล้ววิธีการของโรงงานจะถูกเรียกใช้ภายในวิธีการแบบ

  1. และถ้าเป็นไปได้ตัวอย่าง Java ใด ๆ ที่เกี่ยวข้องกับรูปแบบเหล่านี้?

โรงงานและโรงงานวิธีการ

เจตนา:

กำหนดอินเทอร์เฟซสำหรับการสร้างวัตถุ แต่ให้คลาสย่อยตัดสินใจว่าคลาสใดจะสร้างอินสแตนซ์ วิธีการจากโรงงานช่วยให้การเลื่อนชั้นเรียนเลื่อนระดับเป็นคลาสย่อย

แผนภาพ UML :

ป้อนคำอธิบายรูปภาพที่นี่

ผลิตภัณฑ์:กำหนดอินเทอร์เฟซของวัตถุที่วิธีการสร้างจากโรงงาน

ผลิตภัณฑ์คอนกรีต:ใช้ส่วนต่อประสานผลิตภัณฑ์

ผู้สร้าง:ประกาศวิธีการของโรงงาน

ConcreateCreator: ใช้เมธอด Factory เพื่อส่งคืนอินสแตนซ์ของ ConcreteProduct

ข้อความแจ้งปัญหา: สร้าง Factory of Games โดยใช้ Factory Methods ซึ่งเป็นตัวกำหนดส่วนต่อประสานเกม

ข้อมูลโค้ด:

รูปแบบโรงงาน จะใช้วิธีการจากโรงงานเมื่อใด

เปรียบเทียบกับรูปแบบการสร้างสรรค์อื่น ๆ :

  1. การออกแบบเริ่มต้นโดยใช้วิธีการจากโรงงาน (ซับซ้อนน้อยลงปรับแต่งได้มากขึ้นเพิ่มคลาสย่อย) และพัฒนาไปสู่Abstract Factory, Prototype หรือ Builder (ยืดหยุ่นมากขึ้นซับซ้อนมากขึ้น) เมื่อผู้ออกแบบพบว่าต้องการความยืดหยุ่นมากขึ้น

  2. บทคัดย่อคลาสของโรงงานมักถูกนำไปใช้กับวิธีการของโรงงานแต่ก็สามารถนำไปใช้งานได้โดยใช้Prototype

การอ้างอิงสำหรับการอ่านเพิ่มเติม: รูปแบบการออกแบบซอร์สโค้ด


สำหรับวิธีการจากโรงงานมันไม่ควรจะกำหนดซูเปอร์คลาสหรือ
Tony Lin

21

โรงงาน - แยกคลาสโรงงานเพื่อสร้างวัตถุที่ซับซ้อน

เช่นคลาส FruitFactory เพื่อสร้างวัตถุของ Fruit

class FruitFactory{

public static Fruit getFruit(){...}

}

วิธีการของโรงงาน - แทนที่จะเป็นคลาสแยกต่างหากสำหรับโรงงานเพียงเพิ่มวิธีการหนึ่งในคลาสนั้นเป็นโรงงาน

Ex:

Calendar.getInstance() (Java's Calendar)

บทคัดย่อวิธีการของโรงงาน - โรงงานของ

เช่นให้เราบอกว่าเราต้องการสร้างโรงงานสำหรับชิ้นส่วนคอมพิวเตอร์ มีคอมพิวเตอร์หลายประเภทเช่นแล็ปท็อปเดสก์ท็อปเซิร์ฟเวอร์

ดังนั้นสำหรับ compter แต่ละประเภทเราต้องการโรงงาน ดังนั้นเราจึงสร้างโรงงานระดับสูงหนึ่งแห่งที่โรงงานด้านล่าง

ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

ตอนนี้ทั้งสามนี้เป็นโรงงานอีกครั้ง (คุณจะต้องจัดการกับ PartFactory เอง แต่ภายใต้ประทุนจะมีการใช้งานแยกต่างหากตามสิ่งที่คุณให้ไว้ในโรงงานนามธรรม)

  Interface-> PartFactory. getComputerPart(String s), 
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)

แก้ไข: แก้ไขเพื่อให้อินเทอร์เฟซที่แน่นอนสำหรับ Abstract Factory ตามคำคัดค้านในความคิดเห็น


1
แนวคิดเบื้องหลังComputerFactoryจะเป็นว่าคุณมีอินเทอร์เฟซการสร้างทั่วไป ( getScreen(); getKeyboard(); getDiskdrive(); ...) ไม่ใช่อินเทอร์เฟซสำหรับคอมพิวเตอร์แต่ละชนิดตามที่คุณแนะนำ คุณสามารถดมกลิ่นปัญหาการออกแบบถ้าคุณใช้คำเดียวกันสองครั้งในคำสั่งเดียวกัน: Laptop Factory.get Laptop Part ()
xtofl

ไม่ไม่ไม่ทำรหัสตัวเองอย่างแน่นอน มันเป็นเพียงคำนิยามเพื่อความเข้าใจ หากคุณต้องการตัวอย่างที่แน่นอนด้วยอินเตอร์เฟสนี่คือ วัตถุ: อินเตอร์เฟส -> ComputerPart, Implementation -> RAM, HDD, โรงงานโปรเซสเซอร์: Interface-> PartFactory getComputerPart (String s), Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory บทคัดย่อจากโรงงาน: ComputerType.getPartFactory (“ String s”) การใช้งาน: ComputerType ใหม่ (). getFactory (“ แล็ปท็อป”). getComputerPart (“ RAM”)
Ravi K

2
ฉันได้อัปเดตคำตอบเพื่อดูแลข้อกังวลของคุณแล้ว จริง ๆ แล้วโรงงานที่เป็นนามธรรมนั้นไม่มีอะไรนอกจากความเป็นจริงของโรงงานเท่านั้น ฉันให้ตัวอย่างก่อนหน้านี้เพียงเพื่อการอ้างอิง (สมมติว่าผู้อ่านจะดูแลอินเทอร์เฟซในขณะที่ใช้งานจริง) ยังคงขอบคุณสำหรับการแจ้งเตือน มันเป็นการปรับปรุงที่ดีเสมอ :)
Ravi K

ไม่abstract Factoryไม่ใช่โรงงานของโรงงาน ... เป็นabstract classหรือinterfaceสามารถสร้างวัตถุที่จะนำไปใช้ / ขยายกับโรงงานคอนกรีตที่แตกต่างกัน ดูคำตอบที่ยอมรับได้สำหรับรายละเอียดของรหัส และโปรดลบหรือแก้ไขคำตอบของคุณตามนั้น
Julien__

ฉันชอบคำอธิบายวิธีการของโรงงานซึ่งกระชับพอที่จะเปิดเผยว่าทำไมจึงมีชื่อ ในรูปแบบนี้โรงงานเป็นวิธีการไม่ใช่ชั้นเรียนที่โดยทั่วไปไม่ได้เป็นผู้ช่วยอรรถประโยชน์การจัดกลุ่มวิธีการสร้างอินสแตนซ์ แต่มีความหมายในตัวของมันเอง คำตอบที่ซับซ้อนมากขึ้นอื่น ๆ น่าเสียดายที่พลาดจุดนี้
wlnirvana

11

รูปแบบการออกแบบทุกครั้งจะช่วยให้มั่นใจได้ว่าไม่ได้เขียนรหัสการทำงาน เราทุกคนรู้ว่าเมื่อเราสัมผัสรหัสการทำงานมีข้อบกพร่องในกระบวนการทำงานที่มีอยู่และการทดสอบอีกมากมายที่ต้องทำเพื่อให้แน่ใจว่าเราจะไม่ทำลายอะไรเลย

รูปแบบจากโรงงานจะสร้างวัตถุตามเกณฑ์การป้อนข้อมูลดังนั้นจึงมั่นใจได้ว่าคุณไม่จำเป็นต้องเขียนโค้ดเช่นนี้ถ้าสร้างวัตถุนี้อีกแล้ววัตถุนี้จะเป็นวัตถุ ตัวอย่างที่ดีของเรื่องนี้คือเว็บไซต์การท่องเที่ยว เว็บไซต์การท่องเที่ยวสามารถให้บริการการเดินทาง (เที่ยวบินรถไฟรถบัส) หรือ / และจัดหาโรงแรมหรือ / และเสนอแพคเกจแหล่งท่องเที่ยวเท่านั้น ตอนนี้เมื่อผู้ใช้เลือกถัดไปเว็บไซต์จำเป็นต้องตัดสินใจว่าวัตถุใดที่จำเป็นต้องสร้าง ควรสร้างเฉพาะวัตถุการเดินทางหรือโรงแรมเท่านั้น

ตอนนี้ถ้าคุณมองเห็นการเพิ่มเว็บไซต์อื่นในพอร์ตโฟลิโอของคุณและคุณเชื่อว่ามีการใช้หลักเดียวกันเช่นเว็บไซต์ carpooling ซึ่งตอนนี้ค้นหาแท็กซี่และชำระเงินออนไลน์คุณสามารถใช้โรงงานนามธรรมที่แกนกลางของคุณ ด้วยวิธีนี้คุณสามารถเพียงแค่ติดตั้งแค็บและแค็บในโรงงานอีกหนึ่งแห่ง

โรงงานทั้งสองไม่มีอะไรเกี่ยวข้องกันดังนั้นจึงเป็นการออกแบบที่ดีเพื่อให้พวกเขาอยู่ในโรงงานที่แตกต่างกัน

หวังว่าตอนนี้ชัดเจนแล้ว ศึกษาเว็บไซต์อีกครั้งโดยเก็บตัวอย่างนี้ไว้ในใจหวังว่ามันจะช่วยได้ และฉันหวังว่าฉันจะนำเสนอรูปแบบที่ถูกต้อง :)


3

สำหรับคำตอบนี้ฉันอ้างอิงถึงหนังสือ "Gang of Four"

ขณะนี้ไม่มี "โรงงาน" มิได้ Simple "โรงงาน" มิได้ "โรงงานเสมือน" คำนิยามในหนังสือเล่มนี้ โดยปกติเมื่อผู้คนกำลังพูดถึงรูปแบบ "โรงงาน" พวกเขาอาจพูดถึงบางสิ่งที่สร้างวัตถุเฉพาะของคลาส (แต่ไม่ใช่รูปแบบ "ผู้สร้าง"); พวกเขาอาจหรือไม่อาจอ้างถึงรูปแบบ "วิธีการจากโรงงาน" หรือ "นามธรรมจากโรงงาน" ทุกคนสามารถใช้ "โรงงาน" ได้เพราะเขาไม่ใช่เพราะเป็นคำที่ไม่เป็นทางการ (โปรดจำไว้ว่าบางคน \ company \ community สามารถมีคำศัพท์ของตัวเอง)

หนังสือเล่มเดียวที่มีคำจำกัดความของ "โรงงานบทคัดย่อ" และ "โรงงานวิธี"

นี่คือคำจำกัดความจากหนังสือและคำอธิบายสั้น ๆ ว่าทำไมทั้งคู่จึงสับสน ฉันละเว้นตัวอย่างรหัสเพราะคุณสามารถค้นหาได้ในคำตอบอื่น ๆ :

วิธีการจากโรงงาน (GOF) : กำหนดอินเทอร์เฟซสำหรับการสร้างวัตถุ แต่ให้คลาสย่อยตัดสินใจว่าคลาสใดจะสร้างอินสแตนซ์ วิธีการจากโรงงานช่วยให้การเลื่อนชั้นเรียนเลื่อนระดับเป็นคลาสย่อย

Abstract Factory (GOF) : จัดให้มีอินเตอร์เฟสสำหรับการสร้างตระกูลของวัตถุที่เกี่ยวข้องหรือขึ้นกับโดยไม่ต้องระบุคลาสที่เป็นรูปธรรม

แหล่งที่มาของความสับสน : บ่อยครั้งที่เราสามารถเรียกคลาสที่ใช้ในรูปแบบ "วิธีการของโรงงาน" เป็น "โรงงาน" ชั้นนี้เป็นนามธรรมโดยคำจำกัดความ นั่นเป็นเหตุผลที่ง่ายต่อการเรียกคลาสนี้ว่า "Abstract Factory" แต่มันเป็นเพียงชื่อของคลาส คุณไม่ควรสับสนกับรูปแบบ "Abstract Factory" (ชื่อคลาส! = ชื่อรูปแบบ) รูปแบบ "Abstract Factory" นั้นแตกต่างกัน - มันไม่ได้ใช้คลาสนามธรรม มันกำหนดอินเทอร์เฟซ (ไม่จำเป็นต้องเป็นอินเทอร์เฟซภาษาการเขียนโปรแกรม) สำหรับการสร้างชิ้นส่วนของวัตถุที่ใหญ่กว่าหรือวัตถุที่เกี่ยวข้องกับแต่ละอื่น ๆ หรือจะต้องสร้างในลักษณะที่เฉพาะเจาะจง


2
AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB

interface Factory {
    AbstractProductA getProductA(); //Factory Method - generate A1/A2
}

การใช้วิธีการจากโรงงานผู้ใช้สามารถสร้าง A1 หรือ A2 ของ AbstractProductA

interface AbstractFactory {
    AbstractProductA getProductA(); //Factory Method
    AbstractProductB getProductB(); //Factory Method
}

แต่บทคัดย่อโรงงานมีวิธีโรงงานมากกว่า 1 วิธี (เช่นวิธีโรงงาน 2 วิธี) โดยใช้วิธีโรงงานเหล่านั้นมันจะสร้างชุดของวัตถุ / วัตถุที่เกี่ยวข้อง การใช้ Abstract Factory ผู้ใช้สามารถสร้างวัตถุ A1, B1 ของ AbstractProductA, AbstractProductB


0

ไม่มีใครได้อ้างอิงรูปแบบการออกแบบหนังสือดั้งเดิม: องค์ประกอบของซอฟต์แวร์เชิงวัตถุที่ใช้ซ้ำได้ซึ่งให้คำตอบในสองย่อหน้าแรกของส่วน

มีวิธีการทั่วไปสองวิธีในการกำหนดพารามิเตอร์ของระบบโดยคลาสของวัตถุที่สร้าง วิธีหนึ่งคือการsubclassคลาสที่สร้างวัตถุ สิ่งนี้สอดคล้องกับการใช้รูปแบบวิธีการจากโรงงาน (107) ข้อเสียเปรียบหลักของวิธีนี้คือมันอาจต้องการคลาสย่อยใหม่เพื่อเปลี่ยนคลาสของผลิตภัณฑ์ การเปลี่ยนแปลงดังกล่าวสามารถเรียงซ้อน ตัวอย่างเช่นเมื่อผู้สร้างผลิตภัณฑ์ถูกสร้างขึ้นโดยวิธีการจากโรงงานคุณจะต้องแทนที่ผู้สร้างด้วยเช่นกัน

อีกวิธีหนึ่งในการทำให้เป็นพารามิเตอร์ของระบบขึ้นอยู่กับการจัดองค์ประกอบของวัตถุ: กำหนดวัตถุที่รับผิดชอบในการรู้ระดับของวัตถุผลิตภัณฑ์และทำให้มันเป็นพารามิเตอร์ของระบบ นี่เป็นลักษณะสำคัญของรูปแบบ Abstract Factory (87), Builder (97) และ Prototype (117) ทั้งสามเกี่ยวข้องกับการสร้าง "วัตถุโรงงาน" ใหม่ซึ่งมีความรับผิดชอบในการสร้างวัตถุผลิตภัณฑ์ บทคัดย่อโรงงานมีวัตถุที่ผลิตจากโรงงานหลายชั้น ตัวสร้างมีวัตถุจากโรงงานสร้างผลิตภัณฑ์ที่ซับซ้อนเพิ่มขึ้นโดยใช้โปรโตคอลที่ซับซ้อนที่สอดคล้องกัน ต้นแบบมีวัตถุจากโรงงานสร้างผลิตภัณฑ์โดยการคัดลอกวัตถุต้นแบบ ในกรณีนี้วัตถุจากโรงงานและต้นแบบเป็นวัตถุเดียวกันเนื่องจากต้นแบบมีหน้าที่คืนสินค้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.