-
生产的产品会拥有一个统一的接口
-
产品的实体类实现这个接口
统一接口:
public interface Phone { void call(); }实现类:
public class XiaoMi implements Phone { public void call() { System.out.println("小米"); } }public class HuaWei implements Phone { public void call() { System.out.println("华为"); } }public class Apple implements Phone { public void call() { System.out.println("苹果"); } }简单工厂:
public class SimpleFactory { public Phone getPhone(String name) { Phone phone = null; if(name.equals("小米")) { phone = new XiaoMi(); } else if(name.equals("华为")) { phone = new HuaWei(); } else if (name.equals("苹果")) { phone = new Apple(); } //增加产品会很繁琐 return phone; } } -
缺点:要增加产品必须修改代码,不遵循开闭原则,不适合产品经常变化的场景
- 不负责增加产品,只需要增加产品接口之后交给实现类去增加,抽象工厂可以解决一系列的产品生产的需求当产品多时抽象工厂可以很好的进行管理和扩展
- 和简单工厂模式比较:如果产品种类比较确定那么应该使用简单工厂模式,如果产品种类多变应该使用抽象工厂模式
- 定义产品接口
public interface IPhoneProduct { void open(); void close(); void call(); } // 增加该产品只需要定义该接口然后添加实现类即可 // 不必像简单工厂模式一样 public interface IRouterProduct { void open(); void close(); } - 实现接口
public class MIPhone implements IPhoneProduct { public void open() { System.out.println("小米开机"); } public void close() { System.out.println("小米关机"); } public void call() { System.out.println("小米打电话"); } } public class HWPhone implements IPhoneProduct{ public void open() { System.out.println("华为开机"); } public void close() { System.out.println("华为关机"); } public void call() { System.out.println("华为打电话"); } } public class HWRouter implements IRouterProduct { public void open() { System.out.println("华为路由器开机"); } public void close() { System.out.println("华为路由器关机"); } } public class MIRouter implements IRouterProduct { public void open() { System.out.println("小米路由器开机"); } public void close() { System.out.println("小米路由器关机"); } } - 抽象工厂类
// 定义工厂类接口 public interface IProductFactory { IPhoneProduct getPhone(); IRouterProduct getRouter(); } public class HWFactory implements IProductFactory { public IPhoneProduct getPhone() { return new HWPhone(); } public IRouterProduct getRouter() { return new HWRouter(); } } public class MIFactory implements IProductFactory { public IPhoneProduct getPhone() { return new MIPhone(); } public IRouterProduct getRouter() { return new MIRouter(); } }
- 工厂方法模式就是每一个产品都拥有自己的工厂,需要哪个产品就去找对应的工厂生产
- 虽然满足了开闭原则,但是当需要的产品很多时要创建很多工厂类
- 和简单工厂模式进行比较:工厂方法模式结构更为复杂,代码量更大,并且相比较于简单工厂更难于管理,所以工厂方法模式虽然满足设计原则,但并不适合实际运用,实际中简单工厂更加实用
- 定义工厂接口:
public interface PhoneFatory { Phone getPhone(); } - 创建工厂实现类
public class MiFactory implements PhoneFatory { public Phone getPhone() { return new XiaoMi(); } } public class HwFactory implements PhoneFatory { public Phone getPhone() { return new HuaWei(); } }



