الگوی کارخانه انتزاعی
الگوی کارخانه انتزاعی، در الگوهای نرم‌افزاری روشی برای جمع‌بندی گروهی از کارخانه‌های مجازی است که ساختار مشابهی دارند ولی از کلاس‌های مختلفی تشکیل شده‌اند .به طور مثال کلاس کتابخانه انتزاعی DocumentCreator که رابطی برای ساخت تعدادی از کتابخانه‌ها (ازجمله createLetter و createResume) را فراهم می‌کند. این سامانه می‌تواند به هر تعداد از نسخه‌های کتابخانه‌های مشتق شده از کلاس DocumentCreator را داشته باشد. مثل FancyDocumentCreator یا ModernDocumentCreator هر کدام با یک پیاده‌سازی متفاوت از createLetter و createResume شی‌های مربوطه را تولید کنند. و هر کدام از یک کلاس انتزاعی ثابتی مانند Letter یا Resume ساخته می‌شوند. برنامه زیرشاخه یک ساخته از DocumentCreator را دریافت می‌کند که به آن کارخانه انتزاعی گفته می‌شود. اشیاء ساخته شده همگی توسط یک DocumentCreator ساخته می‌شوند و ساختار مشابهی خواهند داشت. برنامه زیرشاخه تنها نیاز است بداند که چگونه یک کلاس از نوع Letter یا Resume را که از کارخانه می‌گیرد استفاده کند.
کارخانه محل کلاس‌های متشابه داخل کد که اشیاء از آنها ساخته می‌شوند می‌باشد. هدف پیاده‌سازی الگو جداسازی ساخت اشیاء از استفاده‎ آنها و ساخت خانواده‌هایی از اشیاء مرتبط بدون نیاز به وابستگی به نوع کلاس آن‌هاست.
استفاده از این الگو تغییر پیاده‌سازی‌های متفاوت را بدون تغییر برنامه‌هایی که از این پیاده‌سازی‌ها استفاده می‌کنند را ممکن کرده است. هرچند، استفاده از این الگو، مانند الگوهای متشابه، ممکن است باعث پیچیدگی و کار اضافه در نوشتن کد اولیه شود. همچنین جداسازی و انتزاعی کردن در سطح‌های بالا ممکن است موجب امکان اشکال‌زداعی و مراقبت از سامانه‌ها را سخت‌تر بکند.
ماهیت کارخانه انتزاعی را می‌توان این طور تعریف کرد که "رابطی برای ساخت خانواده‌ای از اشیاء مرتبط یا وابسته بدون نیاز به مشخص کردن نوع کلاس آن‌ها.
کارخانه نوع شیءای که قرار است ساخته بشود را تعیین می‌کند. هرچند که تنها یک شیء از آن را بازمی‌گرداند.
این باعث جلوگیری از ساخت شیء توسط برنامه زیرشاخه می‌شود. برنامه زیر شاخه تنها از کارخانه می‌خواهد تا یک شیء از مدل خواسته شده را برای آن بسازد.
از آنجایی که کارخانه تنها یک نشانه‌گر به شیء ساخته شده را بازمی‌گرداند برنامه زیرشاخه نمی‌داند که این شیء از کدام کلاس ساخته شده است. پس نوع شی لازم نیست برای برنامه مشتری تعریف شود. در کل این بدین معنی است که:
دستور createButton در رابط GUIFactory یک شی از نوع button دریافت می‌کند و ایده‌ای ندارد که چه پیاده‌سازی از GUIFactory دریافت کرده است.
باید یک کلید در سیستم عامل‌های ویندوز یا مک ایجاد کند. دقت کنید که برنامه هیچ ایده‌ای ندارد که چه نوع GUIFactory و Buttonای به اون می‌دهند.
interface IButton
interface IGUIFactory
class WinFactory : IGUIFactory
class OSXFactory : IGUIFactory
class WinButton : IButton
class OSXButton : IButton
class Program
interface ButtonInterface
interface GUIFactoryInterface
class WinFactory implements GUIFactoryInterface
class OSXFactory implements GUIFactoryInterface
class WinButton implements ButtonInterface
class OSXButton implements ButtonInterface
$appearance = "osx";
$factory = NULL;
switch ($appearance) {
$button = $factory->CreateButton(); $button->Paint();
public interface IButton { void paint();
public interface IGUIFactory { public IButton createButton();
public class WinFactory implements IGUIFactory { @Override public IButton createButton() { return new WinButton();
public class OSXFactory implements IGUIFactory { @Override public IButton createButton() { return new OSXButton();
public class WinButton implements IButton { @Override public void paint() { System.out.println("WinButton");
public class OSXButton implements IButton { @Override public void paint() { System.out.println("OSX button");
public class Main {
public static void main(String[] args) throws Exception { IGUIFactory factory = null;
String appearance = randomAppearance();//current operating system if (appearance.equals("osx")) { factory = new OSXFactory(); } else if(appearance.equals("windows")) { factory = new WinFactory(); } else { throw new Exception("No such operating system");
IButton button = factory.createButton(); button.paint();
public static String randomAppearance() { String[] appearanceArr = new String[3]; appearanceArr[0] = "osx"; appearanceArr[1] = "windows"; appearanceArr[2] = "error"; java.util.Random rand = new java.util.Random(); int randNum = rand.nextInt(3); return appearanceArr[randNum];
abstract class Button end
class LinuxButton