工厂模式 简单工厂模式(静态工厂模式) 通过Factory来new一个实例,但是如果需要增加实例类的话,需要修改Factory类的代码。
主类只需要知道Factory类即可。
例子: UML类图如下所示
简单工厂UML类图.jpg
源码如下所示: 1 2 3 public interface Car { void name () ; }
1 2 3 4 5 6 public class Tesla implements Car { @Override public void name () { System.out.println("特斯拉!" ); } }
1 2 3 4 5 6 public class WuLing implements Car { @Override public void name () { System.out.println("五菱宏光!" ); } }
1 2 3 4 5 6 7 8 9 10 11 public class CarFactory { public static Car getCar (String name) { if (name == "五菱" ) { return new WuLing(); } else if (name == "特斯拉" ) { return new Tesla(); } else { return null ; } } }
1 2 3 4 5 6 7 8 9 10 public class Customer { public static void main (String[] args) { Car car1 = CarFactory.getCar("五菱" ); Car car2 = CarFactory.getCar("特斯拉" ); car1.name(); car2.name(); } }
工厂方法模式 主类根据需要通过对应的工厂获得实体类。
但是但我们需要增加实体类时,需要增加类和类工厂,类文件变得很多。
例子: UML类图如下所示:
方法工厂模式UML类图.jpg
源码如下所示: 1 2 3 public interface Car { void name () ; }
1 2 3 4 5 6 public class HongQi implements Car { @Override public void name () { System.out.println("红旗汽车!" ); } }
1 2 3 4 5 6 public class Tesla implements Car { @Override public void name () { System.out.println("特斯拉!" ); } }
1 2 3 4 5 6 public class WuLing implements Car { @Override public void name () { System.out.println("五菱宏光!" ); } }
1 2 3 public interface CarFactory { Car getCar () ; }
1 2 3 4 5 6 public class HongQiFactory implements CarFactory { @Override public Car getCar () { return new HongQi(); } }
1 2 3 4 5 6 public class TeslaFactory implements CarFactory { @Override public Car getCar () { return new Tesla(); } }
1 2 3 4 5 6 public class WuLingFactory implements CarFactory { @Override public Car getCar () { return new WuLing(); } }
1 2 3 4 5 6 7 8 9 10 11 12 public class Customer { public static void main (String[] args) { Car car1 = new WuLingFactory().getCar(); Car car2 = new TeslaFactory().getCar(); Car car3 = new HongQiFactory().getCar(); car1.name(); car2.name(); car3.name(); } }
抽象工厂模式 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
例子: UML类图如下:
抽象工厂模式UML类图.jpg
源码如下: 1 2 3 4 5 6 public interface IPhoneProduct { void start () ; void shutdown () ; void callup () ; void sendSMS () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class XiaomiPhone implements IPhoneProduct { public void start () { System.out.println("小米手机-开机" ); } public void shutdown () { System.out.println("小米手机-关机" ); } public void callup () { System.out.println("小米手机-打电话" ); } public void sendSMS () { System.out.println("小米手机-发短信" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class HuaweiPhone implements IPhoneProduct { public void start () { System.out.println("华为手机-开机" ); } public void shutdown () { System.out.println("华为手机-关机" ); } public void callup () { System.out.println("华为手机-打电话" ); } public void sendSMS () { System.out.println("华为手机-发短信" ); } }
1 2 3 4 5 6 public interface IRouterProduct { void start () ; void shutdown () ; void openWifi () ; void setting () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class XiaomiRouter implements IRouterProduct { public void start () { System.out.println("小米路由器-开机" ); } public void shutdown () { System.out.println("小米路由器-关机" ); } public void openWifi () { System.out.println("小米路由器-打开wifi" ); } public void setting () { System.out.println("小米路由器-设置" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class HuaweiRouter implements IRouterProduct { public void start () { System.out.println("华为路由器-开机" ); } public void shutdown () { System.out.println("华为路由器-关机" ); } public void openWifi () { System.out.println("华为路由器-打开wifi" ); } public void setting () { System.out.println("华为路由器-设置" ); } }
1 2 3 4 5 6 public interface IProductFactory { IPhoneProduct phoneProduct () ; IRouterProduct routerProduct () ; }
1 2 3 4 5 6 7 8 9 public class XiaomiFactory implements IProductFactory { public IPhoneProduct phoneProduct () { return new XiaomiPhone(); } public IRouterProduct routerProduct () { return new XiaomiRouter(); } }
1 2 3 4 5 6 7 8 9 public class HuaweiFactory implements IProductFactory { public IPhoneProduct phoneProduct () { return new HuaweiPhone(); } public IRouterProduct routerProduct () { return new HuaweiRouter(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Customer { public static void main (String[] args) { System.out.println("======小米======" ); XiaomiFactory xiaomiFactory = new XiaomiFactory(); IPhoneProduct product1 = xiaomiFactory.phoneProduct(); IRouterProduct product2 = xiaomiFactory.routerProduct(); product1.callup(); product1.sendSMS(); product2.openWifi(); product2.setting(); System.out.println("======华为======" ); HuaweiFactory huaweiFactory = new HuaweiFactory(); IPhoneProduct product3 = huaweiFactory.phoneProduct(); IRouterProduct product4 = huaweiFactory.routerProduct(); product3.callup(); product3.sendSMS(); product4.openWifi(); product4.setting(); } }