工厂设计模式

打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

工厂设计模式

简单(静态)工厂模式

基本介绍


  • 1.简答工厂模式,属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单,最实用的模式。
  • 2.简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
  • 3.在软件开发中,当使用到大量的创建某类,或某些对象时,就会使用到工厂模式。
案例代码
  1. /**
  2. * 抽象的披萨类
  3. * @author 长名06
  4. * @version 1.0
  5. */
  6. public abstract class Pizza {
  7.     private String name;
  8.     public abstract void prepare();
  9.     public void bake(){
  10.         System.out.println(name + "烘烤完成");
  11.     }
  12.     public void cut(){
  13.         System.out.println(name + "切割完成");
  14.     }
  15.     public void box(){
  16.         System.out.println(name + "打包完成");
  17.     }
  18.     public void setName(String name) {
  19.         this.name = name;
  20.     }
  21. }
  22. //具体披萨类
  23. public class PepperPizza extends Pizza{
  24.     @Override
  25.     public void prepare() {
  26.         System.out.println("胡椒披萨准备原材料");
  27.     }
  28. }
  29. public class GreekPizza extends Pizza{
  30.     @Override
  31.     public void prepare() {
  32.         System.out.println("希腊披萨准备原材料");
  33.     }
  34. }
  35. public class CheesePizza extends Pizza{
  36.     @Override
  37.     public void prepare() {
  38.         System.out.println( "芝士披萨" + "准备原材料");
  39.     }
  40. }
  41. //简单工厂类
  42. public class SimpleFactory {
  43.     public static Pizza createPizza(String pizzaType){
  44.         Pizza pizza = null;
  45.         System.out.println("使用简单工厂模式");
  46.         if(pizzaType.equals("greek")){
  47.             pizza = new GreekPizza();
  48.             pizza.setName("希腊披萨");
  49.         }else if(pizzaType.equals("cheese")){
  50.             pizza = new CheesePizza();
  51.             pizza.setName("奶酪披萨");
  52.         }else if(pizzaType.equals("pepper")){
  53.             pizza = new PepperPizza();
  54.             pizza.setName("胡椒披萨");
  55.         }
  56.         return pizza;
  57.     }
  58. }
  59. import java.io.BufferedReader;
  60. import java.io.IOException;
  61. import java.io.InputStreamReader;
  62. /**
  63. * @author 长名06
  64. * @version 1.0
  65. */
  66. public class OrderPizza {
  67.     private BufferedReader br;
  68.     public OrderPizza() {
  69.         Pizza pizza = null;
  70.         do {
  71.             String pizzaType = this.getType();
  72.             pizza = SimpleFactory.createPizza(pizzaType);
  73.             if(pizza != null) {
  74.                 pizza.prepare();
  75.                 pizza.bake();
  76.                 pizza.cut();
  77.                 pizza.box();
  78.             } else {
  79.                 if(br != null){
  80.                     try {
  81.                         br.close();
  82.                     } catch (IOException e) {
  83.                         e.printStackTrace();
  84.                     }
  85.                 }
  86.                 break;
  87.             }
  88.         }while (true);
  89.     }
  90.     public String getType() {
  91.         br = new BufferedReader(new InputStreamReader(System.in));
  92.         System.out.println("input pizza type:");
  93.         String type = "";
  94.         try {
  95.             type = br.readLine();
  96.         }catch (IOException e){
  97.             e.printStackTrace();
  98.         }
  99.         return type;
  100.     }
  101. }
  102. public class PizzaStore {
  103.     public static void main(String[] args) {
  104.         new OrderPizza();
  105.     }
  106. }
复制代码
工厂方法模式

披萨案例新需求

客户在点披萨的时候,可以点不同地区的披萨,比如北京的奶酪披萨,北京的胡椒披萨或者时伦敦的奶酪披萨,伦敦的胡椒披萨。
思路分析,使用简答工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactory,LDPizzaSimpleFactory等,从当前的案例,来说可以使用,但是考虑到项目的规模,及软件的可维护性,扩展性不是很好。
使用工厂方法模式
基本介绍

工厂方法模式设计方案,将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中实现。
工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类实现。
UML类图


案例代码
  1. public abstract class Pizza {
  2.     private String name;
  3.     public abstract void prepare();
  4.     public void bake(){
  5.         System.out.println(name + "烘烤完成");
  6.     }
  7.     public void cut(){
  8.         System.out.println(name + "切割完成");
  9.     }
  10.     public void box(){
  11.         System.out.println(name + "打包完成");
  12.     }
  13.     public void setName(String name) {
  14.         this.name = name;
  15.     }
  16. }
  17. public class LDPepperPizza extends Pizza{
  18.     @Override
  19.     public void prepare() {
  20.         System.out.println("伦敦胡椒披萨准备原材料");
  21.     }
  22. }
  23. public class LDCheesePizza extends Pizza{
  24.     @Override
  25.     public void prepare() {
  26.         System.out.println("伦敦芝士披萨准备原材料");
  27.     }
  28. }
  29. public class BJPepperPizza extends Pizza{
  30.     @Override
  31.     public void prepare() {
  32.         System.out.println("北京胡椒披萨准备原材料");
  33.     }
  34. }
  35. public class BJCheesePizza extends Pizza{
  36.     @Override
  37.     public void prepare() {
  38.         System.out.println("北京芝士披萨准备原材料");
  39.     }
  40. }
  41. public abstract class OrderPizza {
  42.     private BufferedReader br;
  43.     public abstract Pizza createPizza(String type);
  44.     public OrderPizza() {
  45.         Pizza pizza = null;
  46.         do {
  47.             String pizzaType = this.getType();
  48.             pizza = createPizza(pizzaType);
  49.             if(pizza != null) {
  50.                 pizza.prepare();
  51.                 pizza.bake();
  52.                 pizza.cut();
  53.                 pizza.box();
  54.             } else {
  55.                 if(br != null){
  56.                     try {
  57.                         br.close();
  58.                     } catch (IOException e) {
  59.                         e.printStackTrace();
  60.                     }
  61.                 }
  62.                 break;
  63.             }
  64.         }while (true);
  65.     }
  66.     public String getType() {
  67.         br = new BufferedReader(new InputStreamReader(System.in));
  68.         System.out.println("input pizza type:");
  69.         String type = "";
  70.         try {
  71.             type = br.readLine();
  72.         }catch (IOException e){
  73.             e.printStackTrace();
  74.         }
  75.         return type;
  76.     }
  77. }
  78. public class LDOrderPizza extends OrderPizza{
  79.     @Override
  80.     public Pizza createPizza(String type) {
  81.         Pizza pizza = null;
  82.         if(type.equals("cheese")){
  83.             pizza = new BJCheesePizza();
  84.             pizza.setName("北京伦敦披萨");
  85.         }else if(type.equals("pepper")){
  86.             pizza = new BJPepperPizza();
  87.             pizza.setName("北京胡椒披萨");
  88.         }
  89.         return pizza;
  90.     }
  91. }
  92. public class BJOrderPizza extends OrderPizza{
  93.     @Override
  94.     public Pizza createPizza(String type) {
  95.         Pizza pizza = null;
  96.         if(type.equals("cheese")){
  97.             pizza = new BJCheesePizza();
  98.             pizza.setName("北京伦敦披萨");
  99.         }else if(type.equals("pepper")){
  100.             pizza = new BJPepperPizza();
  101.             pizza.setName("北京胡椒披萨");
  102.         }
  103.         return pizza;
  104.     }
  105. }
  106. //测试类
  107. public class PizzaStore {
  108.     public static void main(String[] args) {
  109.         new LDOrderPizza();
  110.     }
  111. }
复制代码
抽象工厂模式

基本介绍


  • 1.抽象工厂模式,定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
  • 2.抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  • 3.从设计层面看,抽象工厂模式就是对简单工厂模式的改进(也叫进一步抽象)。
  • 4.将工厂抽象为两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对象的工厂子类。这样将单个的简单工厂变成了工厂簇,更利于代码的维护和扩展。
uml类图


案例代码
  1. Pizza类,及其子类,同上工厂方法模式
  2. public interface AbsFactory {
  3.     //让子类工厂实现
  4.     public Pizza createPizza(String type);
  5. }
  6. //北京工厂
  7. public class BJFactory implements AbsFactory{
  8.     @Override
  9.     public Pizza createPizza(String type) {
  10.         System.out.println("使用的是抽象工厂模式~");
  11.         Pizza pizza = null;
  12.         if(type.equals("cheese")){
  13.             pizza = new BJCheesePizza();
  14.             pizza.setName("北京芝士披萨");
  15.         }else if(type.equals("pepper")){
  16.             pizza = new BJPepperPizza();
  17.             pizza.setName("北京胡椒披萨");
  18.         }
  19.         return pizza;
  20.     }
  21. }
  22. //伦敦工厂
  23. public class LDFactory implements AbsFactory{
  24.     @Override
  25.     public Pizza createPizza(String type) {
  26.         System.out.println("使用的是抽象工厂模式~");
  27.         Pizza pizza = null;
  28.         if(type.equals("cheese")){
  29.             pizza = new LDCheesePizza();
  30.             pizza.setName("伦敦芝士披萨");
  31.         }else if(type.equals("pepper")){
  32.             pizza = new LDPepperPizza();
  33.             pizza.setName("伦敦胡椒披萨");
  34.         }
  35.         return pizza;
  36.     }
  37. }
  38. //披萨订单
  39. public class OrderPizza {
  40.     private BufferedReader br;
  41.     private AbsFactory absFactory;
  42.     public OrderPizza(AbsFactory absFactory){
  43.         setAbsFactory(absFactory);
  44.     }
  45.     private void setAbsFactory(AbsFactory absFactory) {
  46.         Pizza pizza = null;
  47.         String pizzaType = "";
  48.         this.absFactory = absFactory;
  49.         do{
  50.             pizzaType = this.getType();
  51.             pizza = this.absFactory.createPizza(pizzaType);
  52.             if(pizza == null){
  53.                 try {
  54.                     System.out.println("订购失败");
  55.                     br.close();
  56.                 } catch (IOException e) {
  57.                     e.printStackTrace();
  58.                 }
  59.                 break;
  60.             }else{
  61.                 pizza.prepare();
  62.                 pizza.bake();
  63.                 pizza.cut();
  64.                 pizza.box();
  65.             }
  66.         }while (true);
  67.     }
  68.     public String getType() {
  69.         br = new BufferedReader(new InputStreamReader(System.in));
  70.         System.out.println("input pizza type:");
  71.         String type = "";
  72.         try {
  73.             type = br.readLine();
  74.         }catch (IOException e){
  75.             e.printStackTrace();
  76.         }
  77.         return type;
  78.     }
  79. }
  80. //测试代码
  81. public class PizzaStore {
  82.     public static void main(String[] args) {
  83. //        new OrderPizza(new BJFactory());
  84.         new OrderPizza(new LDFactory());
  85.     }
  86. }
复制代码
工厂模式在JDK-Calendar中的应用


核心代码
  1. if (aLocale.hasExtensions()) {//判断当前时区是否有扩展
  2.     String caltype = aLocale.getUnicodeLocaleType("ca");
  3.     if (caltype != null) {
  4.         switch (caltype) {//采用switch分支创建实例
  5.         case "buddhist":
  6.         cal = new BuddhistCalendar(zone, aLocale);
  7.             break;
  8.         case "japanese":
  9.             cal = new JapaneseImperialCalendar(zone, aLocale);
  10.             break;
  11.         case "gregory":
  12.             cal = new GregorianCalendar(zone, aLocale);
  13.             break;
  14.         }
  15.     }
  16. }
复制代码
工厂模式小结


  • 1.工厂模式的作用,将创建对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目解耦的目的。从而提高项目的扩展和维护性。
  • 2.三种工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)。
  • 3.创建对象实例时,不是直接new对象,而是将new对象的动作,放在一个工厂的方法里,并返回创建的对象。
  • 4.设计模式的依赖倒转原则和里氏替换原则,不要让类继承具体的类,而是继承抽象类和interface,不要覆盖基类中已实现的方法。
案例只是为了体现这种设计模式的思想,不具有实际意义
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表