设计模式之工厂模式
参考链接:https://www.cnblogs.com/yssjun/p/11102162.html
三个工厂模式的区别:根据产品是具体产品还是具体工厂可以分为简单工厂模式和工厂方法模式;根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
一、简单工厂模式
简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:
1 public interface Phone { 2 void make(); 3 }
1 public class MiPhone implements Phone { 2 public MiPhone() { 3 this.make(); 4 } 5 @Override 6 public void make() { 7 // TODO Auto-generated method stub 8 System.out.println("make xiaomi phone!"); 9 } 10 }
1 public class IPhone implements Phone { 2 public IPhone() { 3 this.make(); 4 } 5 @Override 6 public void make() { 7 // TODO Auto-generated method stub 8 System.out.println("make iphone!"); 9 } 10 }
1 public class PhoneFactory { 2 public Phone makePhone(String phoneType) { 3 if(phoneType.equalsIgnoreCase("MiPhone")){ 4 return new MiPhone(); 5 } 6 else if(phoneType.equalsIgnoreCase("iPhone")) { 7 return new IPhone(); 8 } 9 return null; 10 } 11 }
1 public class Demo { 2 public static void main(String[] arg) { 3 PhoneFactory factory = new PhoneFactory(); 4 Phone miPhone = factory.makePhone("MiPhone"); // make xiaomi phone! 5 IPhone iPhone = (IPhone)factory.makePhone("iPhone"); // make iphone! 6 } 7 }
二、工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:
1 public interface AbstractFactory { 2 Phone makePhone(); 3 }
1 public class XiaoMiFactory implements AbstractFactory{ 2 @Override 3 public Phone makePhone() { 4 return new MiPhone(); 5 } 6 }
1 public class AppleFactory implements AbstractFactory { 2 @Override 3 public Phone makePhone() { 4 return new IPhone(); 5 } 6 }
1 public class Demo { 2 public static void main(String[] arg) { 3 AbstractFactory miFactory = new XiaoMiFactory(); 4 AbstractFactory appleFactory = new AppleFactory(); 5 miFactory.makePhone(); // make xiaomi phone! 6 appleFactory.makePhone(); // make iphone! 7 } 8 }
三、抽象工厂模式
上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果要生成另一种产品PC,应该怎么表示呢?
最简单的方式是把2中介绍的工厂方法模式完全复制一份,不过这次生产的是PC。但同时也就意味着我们要完全复制和修改Phone生产管理的所有代码,显然这是一个笨办法,并不利于扩展和维护。
抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。
其UML类图如下:
注意:PC产品与Phone定义类似。
1 public interface AbstractFactory { 2 Phone makePhone(); 3 PC makePC(); 4 }
1 public class XiaoMiFactory implements AbstractFactory{ 2 @Override 3 public Phone makePhone() { 4 return new MiPhone(); 5 } 6 @Override 7 public PC makePC() { 8 return new MiPC(); 9 } 10 }
1 public class AppleFactory implements AbstractFactory { 2 @Override 3 public Phone makePhone() { 4 return new IPhone(); 5 } 6 @Override 7 public PC makePC() { 8 return new MAC(); 9 } 10 }
public class Demo { public static void main(String[] arg) { AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makePhone(); // make xiaomi phone! miFactory.makePC(); // make xiaomi PC! appleFactory.makePhone(); // make iphone! appleFactory.makePC(); // make MAC! } }