1.工厂方法
- 意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类
- 适用性
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
- 工厂方法模式的构成
产品角色(Product):定义产品的接口
具体产品角色(ConcreteProduct):实现接口Product的类
工厂角色(Creator):声明工厂方法(FactoryMethod),返回一个产品
具体工厂角色(ConcreteCreator):实现FactoryMethod方法,由客户调用,返回一个产品的实例
- 类图
- UML序列图
首先定义一个产品接口或者抽象类,定义一个抽象工厂接口,然后不同的产品是由不同的工厂制造出来的就好像定义一个手机接口,手机有不同的品牌,如诺基亚和摩托罗拉 具体的产品,定义一个生产手机的工厂接口,然后由不同的品牌手机的工厂生产不同的手机,一个具体工厂对应一个具体的产品
手机接口:
摩托罗拉手机package Factory; public interface Mobile { void call(); }
诺基亚手机public class Motorola implements Mobile { @Override public void call() { System.out.println("Motorola.call"); } }
package Factory; public class Nokia implements Mobile { @Override public void call() { System.out.println("Nokia.call"); } }
工厂接口:package Factory; public interface MobileFactory { Mobile produceMobile(); }
摩托罗拉手机工厂:诺基亚工厂package Factory; public class MotorolaFactory implements MobileFactory { @Override public Mobile produceMobile() { System.out.println("MotorolaFactory.produceMobile"); return new Motorola(); } }
package Factory; public class NokiaFactory implements MobileFactory { @Override public Mobile produceMobile() { System.out.println("NokiaFactory.produceMobile"); return new Nokia(); } }
package Factory; public class Client { public static void main(String[] args) { MobileFactory mobileFactory; Mobile mobile; mobileFactory = new MotorolaFactory(); mobile = mobileFactory.produceMobile(); mobile.call(); mobileFactory = new NokiaFactory(); mobile = mobileFactory.produceMobile(); mobile.call(); } }
打印结果:
MotorolaFactory.produceMobile
Motorola.call
NokiaFactory.produceMobile
Nokia.call2.抽象工厂模式
- 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
- 适用性
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时
- 抽象工厂的构成
抽象工厂角色(AbstractFactory):声明生成抽象产品的方法具体工厂角色(ConcreteFactory):执行生成抽象产品的方法,生成一个具体的产品抽象产品(AbstractProduct):为一种产品声明接口具体产品(ConcreteProduct):定义具体工厂生成的具体产品的对象,实现产品接口客户角色(Client):我们的应用程序,使用抽象产品和抽象工厂生成对象
- 类图
- UML序列图
抽象工厂于工厂方法的区别:工厂方法每一次生产一个对象,而抽象工厂方法每次生产两个或者两个以上的对象,并且这些对象相互依赖或者相互影响的