本文由 colodoo(纸伞)整顿
参考书籍《图解设计模式》
QQ 425343603
Java学习交换群(717726984)

工厂模式

  • Product(产品)
  • Creator(创建者)
  • ConcreteProduct(具体的产品)
  • ConcreteCreator(具体的创建者)

    Product(产品)

Product角色属于框架这一方,是一个抽象类。

Creator(创建者)

Creator角色属于框架这一方,它是负责生成Product角色的抽象类,但具体的解决则由子类ConcreteCreator角色决定。

ConcreteProduct(具体的产品)

ConcreteProduct角色属于具体加工这一方,他决定了具体产品。

ConcreteCreator(具体的创造者)

ConcreteCreator角色属于具体加工这一方,它负责生成具体的产品。

类图

代码样例

/** * 工厂抽象类 * * @author colodoo(纸伞) **/public abstract class Factory {        // 创立    public final Product create(String owner) {        Product product = new createProduct(owner);        registerProduct(product);        return product;    }        // 创立产品    protected abstract Product createProduct(String owner);        // 注册产品    protected abstract void registerProduct(Product product);    }
/** * 具体工厂类 * * @author colodoo(纸伞) **/public class ConcreteFactory extends Factory {        private List owners = new ArrayList();        // 创立产品    protected Product createProduct(String owner) {        return new ConcreteProduct(owner);    }        // 注册产品    protected void registerProduct(Product product) {        owners.add(((ConcretedProduct) product).getOnwer());    }        // 获取拥有者列表    public List getOwners() {        return owners;    }            }
/** * 产品抽象类 * * @author colodoo(纸伞) **/public abstract class Product {        // 应用    public abstract void use();    }
/** * 具体产品类 * * @author colodoo(纸伞) **/public class ConcreteProduct extends Product {        // 拥有者    private String owner;        // 构造方法    public ConcreteProduct(String owner) {        this.owner = owner;    }        // 获取拥有者    public String getOwner() {        return this.owner;    }        // 应用    public void use() {        // 解决逻辑        // TODO        System.out.println("应用产品");    }    }
public class Main {        public static void main(String[] args) {                Factory factory = new ConcreteFactory();        Product prodcut1 = factory.create("1");        Product prodcut2 = factory.create("2");                prodcut1.use();        prodcut2.use();            }    }