|
| 1 | +--- |
| 2 | +--- |
| 3 | +title: "الگوی factory در جاوا: سادهسازی ایجاد اشیاء" |
| 4 | +shortTitle: factory |
| 5 | +description: "الگوی طراحی factory در جاوا را با مثالها و توضیحات دقیق بیاموزید. یاد بگیرید چگونه با استفاده از الگوی factory کدی انعطافپذیر و مقیاسپذیر ایجاد کنید. مناسب برای توسعهدهندگانی که به دنبال بهبود مهارتهای طراحی شیءگرا هستند." |
| 6 | +category: structural |
| 7 | +language: fa |
| 8 | +tag: |
| 9 | + - انتزاع |
| 10 | + - کپسولهسازی |
| 11 | + - گروه چهار نفره |
| 12 | + - نمونهسازی |
| 13 | + - چندریختی |
| 14 | +--- |
| 15 | + |
| 16 | +## هدف از الگوی طراحی factory |
| 17 | + |
| 18 | +الگوی طراحی factory در جاوا یک الگوی ساختاری است که یک رابط برای ایجاد یک شیء تعریف میکند اما به زیرکلاسها اجازه میدهد نوع اشیائی را که ایجاد خواهند شد تغییر دهند. این الگو انعطافپذیری و مقیاسپذیری را در کد شما ترویج میدهد. |
| 19 | + |
| 20 | +## توضیح دقیق الگوی factory با مثالهای دنیای واقعی |
| 21 | + |
| 22 | +### مثال دنیای واقعی |
| 23 | + |
| 24 | +> تصور کنید در یک نانوایی انواع مختلف کیکها با استفاده از الگوی طراحی factory ساخته میشوند. `CakeFactory` فرآیند ایجاد را مدیریت میکند و امکان افزودن آسان انواع جدید کیکها را بدون تغییر در فرآیند اصلی فراهم میکند. `CakeFactory` میتواند انواع مختلفی از کیکها مانند کیک شکلاتی، کیک وانیلی و کیک توتفرنگی تولید کند. به جای اینکه کارکنان نانوایی به صورت دستی مواد اولیه را انتخاب کنند و دستورالعملهای خاصی را برای هر نوع کیک دنبال کنند، از `CakeFactory` برای مدیریت فرآیند استفاده میکنند. مشتری فقط نوع کیک را درخواست میکند و `CakeFactory` مواد اولیه و دستورالعمل مناسب را تعیین کرده و نوع خاصی از کیک را ایجاد میکند. این تنظیم به نانوایی اجازه میدهد تا انواع جدید کیکها را به راحتی اضافه کند بدون اینکه فرآیند اصلی تغییر کند، که این امر انعطافپذیری و مقیاسپذیری را ترویج میدهد. |
| 25 | + |
| 26 | +### تعریف ویکیپدیا |
| 27 | + |
| 28 | +> factory یک شیء برای ایجاد اشیاء دیگر است – به طور رسمی، factory یک تابع یا متدی است که اشیاء با نمونهها یا کلاسهای مختلف را بازمیگرداند. |
| 29 | +
|
| 30 | +### نمودار توالی |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +## مثال برنامهنویسی از الگوی factory در جاوا |
| 35 | + |
| 36 | +تصور کنید یک کیمیاگر قصد دارد سکههایی تولید کند. کیمیاگر باید بتواند هم سکههای طلا و هم سکههای مسی ایجاد کند و تغییر بین آنها باید بدون تغییر در کد موجود امکانپذیر باشد. الگوی factory این امکان را فراهم میکند با ارائه یک متد ایجاد استاتیک که میتوان آن را با پارامترهای مرتبط فراخوانی کرد. |
| 37 | + |
| 38 | +در جاوا، میتوانید الگوی factory را با تعریف یک رابط `Coin` و پیادهسازیهای آن `GoldCoin` و `CopperCoin` پیادهسازی کنید. کلاس `CoinFactory` یک متد استاتیک `getCoin` ارائه میدهد تا اشیاء سکه را بر اساس نوع ایجاد کند. |
| 39 | + |
| 40 | +```java |
| 41 | +public interface Coin { |
| 42 | + String getDescription(); |
| 43 | +} |
| 44 | +``` |
| 45 | + |
| 46 | +```java |
| 47 | +public class GoldCoin implements Coin { |
| 48 | + |
| 49 | + static final String DESCRIPTION = "This is a gold coin."; |
| 50 | + |
| 51 | + @Override |
| 52 | + public String getDescription() { |
| 53 | + return DESCRIPTION; |
| 54 | + } |
| 55 | +} |
| 56 | +``` |
| 57 | + |
| 58 | +```java |
| 59 | +public class CopperCoin implements Coin { |
| 60 | + |
| 61 | + static final String DESCRIPTION = "This is a copper coin."; |
| 62 | + |
| 63 | + @Override |
| 64 | + public String getDescription() { |
| 65 | + return DESCRIPTION; |
| 66 | + } |
| 67 | +} |
| 68 | +``` |
| 69 | + |
| 70 | +کد زیر انواع سکههایی که پشتیبانی میشوند (`GoldCoin` و `CopperCoin`) را نشان میدهد. |
| 71 | + |
| 72 | +```java |
| 73 | +@RequiredArgsConstructor |
| 74 | +@Getter |
| 75 | +public enum CoinType { |
| 76 | + |
| 77 | + COPPER(CopperCoin::new), |
| 78 | + GOLD(GoldCoin::new); |
| 79 | + |
| 80 | + private final Supplier<Coin> constructor; |
| 81 | +} |
| 82 | +``` |
| 83 | + |
| 84 | +سپس متد استاتیک `getCoin` برای ایجاد اشیاء سکه در کلاس factory `CoinFactory` کپسوله شده است. |
| 85 | + |
| 86 | +```java |
| 87 | +public class CoinFactory { |
| 88 | + |
| 89 | + public static Coin getCoin(CoinType type) { |
| 90 | + return type.getConstructor().get(); |
| 91 | + } |
| 92 | +} |
| 93 | +``` |
| 94 | + |
| 95 | +اکنون، در کد کلاینت، میتوانیم انواع مختلفی از سکهها را با استفاده از کلاس factory تولید کنیم. |
| 96 | + |
| 97 | +```java |
| 98 | +public static void main(String[] args) { |
| 99 | + LOGGER.info("The alchemist begins his work."); |
| 100 | + var coin1 = CoinFactory.getCoin(CoinType.COPPER); |
| 101 | + var coin2 = CoinFactory.getCoin(CoinType.GOLD); |
| 102 | + LOGGER.info(coin1.getDescription()); |
| 103 | + LOGGER.info(coin2.getDescription()); |
| 104 | +} |
| 105 | +``` |
| 106 | + |
| 107 | +خروجی برنامه: |
| 108 | + |
| 109 | +``` |
| 110 | +06:19:53.530 [main] INFO com.iluwatar.factory.App -- The alchemist begins his work. |
| 111 | +06:19:53.533 [main] INFO com.iluwatar.factory.App -- This is a copper coin. |
| 112 | +06:19:53.533 [main] INFO com.iluwatar.factory.App -- This is a gold coin. |
| 113 | +``` |
| 114 | + |
| 115 | +## زمان استفاده از الگوی factory در جاوا |
| 116 | + |
| 117 | +* از الگوی طراحی factory در جاوا زمانی استفاده کنید که کلاس از قبل نوع دقیق و وابستگیهای اشیائی که نیاز به ایجاد آن دارد را نمیداند. |
| 118 | +* زمانی که یک متد یکی از چندین کلاس ممکن که یک کلاس والد مشترک دارند را بازمیگرداند و میخواهد منطق انتخاب شیء را کپسوله کند. |
| 119 | +* این الگو معمولاً هنگام طراحی فریمورکها یا کتابخانهها برای ارائه بهترین انعطافپذیری و جداسازی از انواع کلاسهای خاص استفاده میشود. |
| 120 | + |
| 121 | +## کاربردهای دنیای واقعی الگوی factory در جاوا |
| 122 | + |
| 123 | +* [java.util.Calendar#getInstance()](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) |
| 124 | +* [java.util.ResourceBundle#getBundle()](https://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-) |
| 125 | +* [java.text.NumberFormat#getInstance()](https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance--) |
| 126 | +* [java.nio.charset.Charset#forName()](https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String-) |
| 127 | +* [java.net.URLStreamHandlerFactory#createURLStreamHandler(String)](https://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html) (اشیاء singleton مختلف را بر اساس یک پروتکل بازمیگرداند) |
| 128 | +* [java.util.EnumSet#of()](https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of(E)) |
| 129 | +* [javax.xml.bind.JAXBContext#createMarshaller()](https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller--) و متدهای مشابه دیگر. |
| 130 | +* JavaFX از الگوهای factory برای ایجاد کنترلهای مختلف رابط کاربری متناسب با نیازهای محیط کاربر استفاده میکند. |
| 131 | + |
| 132 | +## مزایا و معایب الگوی factory |
| 133 | + |
| 134 | +### مزایا: |
| 135 | + |
| 136 | +* پیادهسازی الگوی factory در برنامه جاوای شما، وابستگی بین پیادهسازی و کلاسهایی که استفاده میکند را کاهش میدهد. |
| 137 | +* از [اصل Open/Closed](https://java-design-patterns.com/principles/#open-closed-principle) پشتیبانی میکند، زیرا سیستم میتواند انواع جدیدی را بدون تغییر کد موجود معرفی کند. |
| 138 | + |
| 139 | +### معایب: |
| 140 | + |
| 141 | +* کد میتواند به دلیل معرفی چندین کلاس اضافی پیچیدهتر شود. |
| 142 | +* استفاده بیش از حد میتواند کد را کمتر خوانا کند اگر پیچیدگی ایجاد اشیاء کم یا غیرضروری باشد. |
| 143 | + |
| 144 | +## الگوهای طراحی مرتبط با جاوا |
| 145 | + |
| 146 | +* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): میتوان آن را نوعی factory در نظر گرفت که با گروهی از محصولات کار میکند. |
| 147 | +* [Singleton](https://java-design-patterns.com/patterns/singleton/): اغلب همراه با factory استفاده میشود تا اطمینان حاصل شود که یک کلاس تنها یک نمونه دارد. |
| 148 | +* [Builder](https://java-design-patterns.com/patterns/builder/): ساخت یک شیء پیچیده را از نمایش آن جدا میکند، مشابه نحوهای که factoryها مدیریت نمونهسازی را انجام میدهند. |
| 149 | +* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/): یک factory از محتوای غیرقابل تغییر با رابطهای builder و factory جداگانه است. |
| 150 | + |
| 151 | +## منابع و اعتبارات |
| 152 | + |
| 153 | +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0Rk5y) |
| 154 | +* [Effective Java](https://amzn.to/4cGk2Jz) |
| 155 | +* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/3UpTLrG) |
0 commit comments