意图:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
主要解决: 接口选择问题。
何时使用: 在有多个业务品种、业务分类时。
如何解决: 在一个业务品种或业务分类里面,定义多个业务。
关键代码: 在一个工厂里聚合多个同类产品。
优点: 封装性;产品族内的约束为非公开状态。
缺点: 扩展困难。
应用实例: 一个耳机工厂生产不同颜色不同形状的耳机。
1.为耳机颜色创建一个接口。
public interface EarphoneColor {
//耳机颜色
void color();
}
2.实现接口实体类
public class Red implements EarphoneColor{
@Override
public void color() {
System.out.println("耳机为红色");
}
}
public class Black implements EarphoneColor{
@Override
public void color() {
System.out.println("耳机为黑色!");
}
}
3. 创建耳机形状接口
public interface EarphoneShape {
//耳机形状
void shape();
}
4. 实现接口实体类
public class PlugIn implements EarphoneShape{
@Override
public void shape() {
System.out.println("插入式耳机");
}
}
public class HeadMounted implements EarphoneShape{
@Override
public void shape() {
System.out.println("头戴式耳机");
}
}
5. 为颜色和形状创建抽象类来获取工厂
public abstract class DeviceFactory {
public abstract EarphoneColor getColor(String color);
public abstract EarphoneShape getShape(String shape);
}
6. 生成实体类的对象。
public class ColorFactory extends DeviceFactory{
@Override
public EarphoneColor getColor(String color) {
if(color == null)
return null;
if(color.equalsIgnoreCase("red"))
return new Red();
else if(color.equalsIgnoreCase("black"))
return new Black();
return null;
}
@Override
public EarphoneShape getShape(String shape) {
return null;
}
}
public class ShapeFactory extends DeviceFactory{
@Override
public EarphoneColor getColor(String color) {
return null;
}
@Override
public EarphoneShape getShape(String shape) {
if(shape == null)
return null;
if(shape.equalsIgnoreCase("plug-in"))
return new PlugIn();
else if(shape.equalsIgnoreCase("head-mounted"))
return new HeadMounted();
return null;
}
}
7.创建一个工厂生成器类,通过传递参数来获取工厂。
public class FactoryProducer {
public static DeviceFactory getFactory(String factoryName) {
if(factoryName.equalsIgnoreCase("shape"))
return new ShapeFactory();
else if(factoryName.equalsIgnoreCase("color"))
return new ColorFactory();
return null;
}
}
8.实例
public class Custom {
public static void main(String[] args) {
//获取耳机形状工厂
DeviceFactory df = FactoryProducer.getFactory("shape");
//获取形状为头戴式
EarphoneShape es = df.getShape("head-mounted");
es.shape();
}
}
参考:
设计模式简介
网友评论