意图:定义一个用于创建对象的接口,让子类决定创建那个类。Factory Method使一个类的实例化延迟到其子类中
动机:框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责
适用性:
1.当一个类不知道它所必须创建的对象的类的时候
2.当一个类希望由它的子类来指定它所创建的对象的时候
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将那一个帮助子类是代理者这一信息局部化的时候
结构:
工厂方法的实现主要有两种情况:
1.Creator类是一个抽象类并且不提供它所声明的工厂方法的实现
2.Creator是一个具体的类而且为工厂方法提供一个缺省的实现
实例:
1 package com.test.patten.factory; 2 3 public abstract class Creator { 4 public abstract Product productFactory(String type); 5 6 public void doSomething(String type) { 7 Product product = productFactory(type); 8 product.getPrice(); 9 } 10 }
1 package com.test.patten.factory; 2 3 public abstract class Product { 4 double price = 0; 5 public void getPrice() { 6 System.out.println("我的价格是:"+price); 7 } 8 }
1 package com.test.patten.factory; 2 3 public class GoodProduct extends Product { 4 5 public GoodProduct() { 6 super(); 7 this.price = 100.0; 8 } 9 }
1 package com.test.patten.factory; 2 3 public class BadProduct extends Product { 4 5 public BadProduct() { 6 super(); 7 this.price = 0.01; 8 } 9 }
1 package com.test.patten.factory; 2 3 public class ConcreteCreator extends Creator { 4 5 @Override 6 public Product productFactory(String type) { 7 Product product = null; 8 if(type.equals("good")){ 9 product = new GoodProduct(); 10 }else if (type.equals("bad")) { 11 product = new BadProduct(); 12 } 13 return product; 14 } 15 16 }
测试一下:
1 package com.test.patten.factory; 2 3 public class Client { 4 public static void main(String args[]){ 5 Creator creator = new ConcreteCreator(); 6 creator.doSomething("good");//生产一个好的产品 7 creator.doSomething("bad");//生产一个次品 8 } 9 }
我的价格是:100.0
我的价格是:0.01
应用:工厂方法主要应用于工具包和框架中
设计原则:要依赖抽象,不要依赖具体类-依赖倒置原则