工厂模式

工厂模式

简单工厂模式

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

使用简单工厂模式

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

//简单工厂类
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());
   }

}
posted @ 2020-12-01 14:22  Maple_XL  阅读(64)  评论(0编辑  收藏  举报