简单工厂和工厂
2019-09-06 13:27 tonyniu8 阅读(310) 评论(0) 收藏 举报简单工厂定义:
由一个简单工厂对象决定创建出哪一种产品类的实例。工厂类内部有必要的判断逻辑可以决定什么时候创建哪一种产品的实例。
这里以大话设计模式中的计算器为例子。
一个计算器Operation 抽象类, 然后定义了Add, Substract, Multiply, Divide 类来继承它。
另有 输入一个 String, 返回想要的具体类。
1 package com.disignpattern.simplefactory; 2 3 public abstract class Operation { 4 private double a; 5 private double b; 6 public double getA() { 7 return a; 8 } 9 public void setA(double a) { 10 this.a = a; 11 } 12 public double getB() { 13 return b; 14 } 15 public void setB(double b) { 16 this.b = b; 17 } 18 19 public abstract double getResult(); 20 21 } 22 23 24 25 public class OperationAdd extends Operation { 26 @Override 27 public double getResult() { 28 return getA() + getB(); 29 } 30 } 31 32 public class OperationDiv extends Operation { 33 @Override 34 public double getResult() { 35 36 return getA() / getB(); 37 } 38 } 39 40 public class OperationMul extends Operation { 41 @Override 42 public double getResult() { 43 return getA() * getB(); 44 } 45 } 46 47 48 public class OperationSub extends Operation { 49 @Override 50 public double getResult() { 51 return getA() - getB(); 52 } 53 }
最后上工厂类。
1 public class OperationFactory { 2 public static Operation getOperation(String s) { 3 Operation operation = null; 4 switch (s) { 5 case "+": 6 operation = new OperationAdd(); 7 break; 8 case "-": 9 operation = new OperationSub(); 10 break; 11 case "*": 12 operation = new OperationMul(); 13 break; 14 case"/": 15 operation = new OperationDiv(); 16 break; 17 } 18 19 return operation; 20 } 21 }
jdk源码使用简单工厂方法的案例分析
一般要用到Switch case.
1 private static Calendar createCalendar(TimeZone zone, 2 Locale aLocale) 3 { 4 CalendarProvider provider = 5 LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale) 6 .getCalendarProvider(); 7 if (provider != null) { 8 try { 9 return provider.getInstance(zone, aLocale); 10 } catch (IllegalArgumentException iae) { 11 // fall back to the default instantiation 12 } 13 } 14 15 Calendar cal = null; 16 17 if (aLocale.hasExtensions()) { 18 String caltype = aLocale.getUnicodeLocaleType("ca"); 19 if (caltype != null) { 20 switch (caltype) { 21 case "buddhist": 22 cal = new BuddhistCalendar(zone, aLocale); 23 break; 24 case "japanese": 25 cal = new JapaneseImperialCalendar(zone, aLocale); 26 break; 27 case "gregory": 28 cal = new GregorianCalendar(zone, aLocale); 29 break; 30 } 31 } 32 } 33 }
工厂模板
之前的工厂改成抽象工厂
工厂改成抽象工厂。
AddOperationFactory实现抽象工厂
SubOperationFactory实现抽象工厂
客户端创建对应工厂,再创建实例
1 1 public interface Factory { 2 2 Operation createOperation(); 3 3 } 4 4 5 5 class AddOperationFactory implements Factory { 6 6 @Override 7 7 public Operation createOperation() { 8 8 return new OperationAdd(); 9 9 } 10 10 } 11 11 12 12 class SubOperationFactory implements Factory { 13 13 @Override 14 14 public Operation createOperation() { 15 15 return new OperationSub(); 16 16 } 17 17 } 18 18 19 19 class Client { 20 20 public static void main(String[] args) { 21 21 Factory addFactory = new AddOperationFactory(); 22 22 Operation operation = addFactory.createOperation(); 23 23 operation.setA(1); 24 24 operation.setB(2); 25 25 System.out.println(operation.getResult()); 26 26 } 27 27 }
浙公网安备 33010602011771号