zoukankan      html  css  js  c++  java
  • 工厂模式

    工厂模式

    简单工厂模式

    • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
    • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
    • 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.

    使用简单工厂模式

    简单工厂模式的设计方案:定义一个可以实例化对象的类,封装创建对象的代码。

    //简单工厂类
    public class SimpleFactory {
    
    	//根据orderType 返回对应的Pizza 对象
    	public Pizza createPizza(String orderType) {
    
    		Pizza pizza = null;
    
    		System.out.println("使用简单工厂模式");
    		if (orderType.equals("greek")) {
    			pizza = new GreekPizza();
    			pizza.setName(" 希腊披萨 ");
    		} else if (orderType.equals("cheese")) {
    			pizza = new CheesePizza();
    			pizza.setName(" 奶酪披萨 ");
    		} else if (orderType.equals("pepper")) {
    			pizza = new PepperPizza();
    			pizza.setName("胡椒披萨");
    		}
    		
    		return pizza;
    	}
    	
    	//简单工厂模式 也叫 静态工厂模式 
    	
    	public static Pizza createPizza2(String orderType) {
    
    		Pizza pizza = null;
    
    		System.out.println("使用简单工厂模式2");
    		if (orderType.equals("greek")) {
    			pizza = new GreekPizza();
    			pizza.setName(" 希腊披萨 ");
    		} else if (orderType.equals("cheese")) {
    			pizza = new CheesePizza();
    			pizza.setName(" 奶酪披萨 ");
    		} else if (orderType.equals("pepper")) {
    			pizza = new PepperPizza();
    			pizza.setName("胡椒披萨");
    		}
    		
    		return pizza;
    	}
    
    }
    
    public class OrderPizza {
    
       Pizza pizza = null;
       String orderType = "";
       // 构造器
       public OrderPizza() {
          
          do {
             orderType = getType();
             pizza = SimpleFactory.createPizza2(orderType);
    
             // 输出pizza
             if (pizza != null) { // 订购成功
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
             } else {
                System.out.println(" 订购披萨失败 ");
                break;
             }
          } while (true);
       }
    
       // 写一个方法,可以获取客户希望订购的披萨种类
       private String getType() {
          try {
             BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
             System.out.println("input pizza 种类:");
             String str = strin.readLine();
             return str;
          } catch (IOException e) {
             e.printStackTrace();
             return "";
          }
       }
    }
    
    public class PizzaStore {
    
       public static void main(String[] args) {
          // TODO Auto-generated method stub
          //new OrderPizza();
          
          //使用简单工厂模式
          //new OrderPizza(new SimpleFactory());
          //System.out.println("~~退出程序~~");
          
          new OrderPizza2();
       }
    
    }
    

    抽象类Pizza、实现类CheesePizza、GreekPizza、PepperPizza 代码略

    抽象工厂模式

    image-20200729170920497

    • 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
    • 抽象工厂模式可以将简单工厂模式和工厂o方法模式进行整合。
    • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步 的抽象)。
    • 将工厂抽象成两层,AbsFactory(抽象工厂)具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
    //一个抽象工厂模式的抽象层(接口)
    public interface AbsFactory {
    	//让下面的工厂子类来 具体实现
    	public Pizza createPizza(String orderType);
    }
    
    //这是工厂子类
    public class BJFactory implements AbsFactory {
    
       @Override
       public Pizza createPizza(String orderType) {
          System.out.println("~使用的是抽象工厂模式~");
          // TODO Auto-generated method stub
          Pizza pizza = null;
          if(orderType.equals("cheese")) {
             pizza = new BJCheesePizza();
          } else if (orderType.equals("pepper")){
             pizza = new BJPepperPizza();
          }
          return pizza;
       }
    
    }
    
    public class LDFactory implements AbsFactory {
    
       @Override
       public Pizza createPizza(String orderType) {
          System.out.println("~使用的是抽象工厂模式~");
          Pizza pizza = null;
          if (orderType.equals("cheese")) {
             pizza = new LDCheesePizza();
          } else if (orderType.equals("pepper")) {
             pizza = new LDPepperPizza();
          }
          return pizza;
       }
    
    }
    
    public class OrderPizza {
    
       AbsFactory factory;
    
       // 构造器
       public OrderPizza(AbsFactory factory) {
          setFactory(factory);
       }
    
       private void setFactory(AbsFactory factory) {
          Pizza pizza = null;
          String orderType = ""; // 用户输入
          this.factory = factory;
          do {
             orderType = getType();
             // factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
             pizza = factory.createPizza(orderType);
             if (pizza != null) { // 订购ok
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
             } else {
                System.out.println("订购失败");
                break;
             }
          } while (true);
       }
    
       // 写一个方法,可以获取客户希望订购的披萨种类
       private String getType() {
          try {
             BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
             System.out.println("input pizza 种类:");
             String str = strin.readLine();
             return str;
          } catch (IOException e) {
             e.printStackTrace();
             return "";
          }
       }
    }
    
    public class PizzaStore {
    
       public static void main(String[] args) {
          //new OrderPizza(new BJFactory());
          new OrderPizza(new LDFactory());
       }
    
    }
    
  • 相关阅读:
    Tomcat 环境搭建
    Samba 3.6.9 安装、管理
    FTP vsftp 安装、管理
    FTP pure-ftpd 安装、管理
    NFS 安装、管理
    sql
    mysql Encryption and Compression Functions
    jQuery UI Layout Plug-in
    mysql存储过程、函数和触发器的创建 [转]
    bootstrap前端开发框架,未来发展趋势
  • 原文地址:https://www.cnblogs.com/junlinsky/p/14067775.html
Copyright © 2011-2022 走看看