工厂方法模式即父类定义接口,具体的实现交给子类来做,从而提供开闭原则
/** * @author maikec * @date 2019/5/10 */ public abstract class AbstractFactory { /** * 创建产品 * @param owner * @return AbstractProduct */ protected abstract AbstractProduct createProduct(String owner); /** * 把产品注入数组 * @param product */ protected abstract void registerProduct(AbstractProduct product); /** * 创建产品并注入列表 * @return */ public final AbstractProduct create(String owner){ AbstractProduct product = createProduct(owner); registerProduct(product); return product; } } /** * @author maikec * @date 2019/5/10 */ public abstract class AbstractProduct { /** * 使用 */ public abstract void use(); } /** * @author maikec * @date 2019/5/10 */ public class IDCardFactory extends AbstractFactory { private final List<IDCard> idCards = new LinkedList<>( ); @Override protected AbstractProduct createProduct(String owner) { if (null == owner){ throw new IllegalArgumentException( "owner cannot be null" ); } return new IDCard( owner ); } @Override protected void registerProduct(AbstractProduct product) { if (!(product instanceof IDCard)){ throw new IllegalArgumentException( "product should be IDCard instance" ); } idCards.add( (IDCard) product ); } } /** * @author maikec * @date 2019/5/10 */ public class IDCard extends AbstractProduct { public IDCard(String owner){ this.owner = owner; } private String owner; public String getOwner() { return owner; } @Override public void use() { System.out.println( "This is " + owner + " IDCard" ); } } /** * @author maikec * @date 2019/5/10 */ public class FactoryMethodDemo { public static void main(String[] args) { AbstractFactory factory = new IDCardFactory(); AbstractProduct product = factory.create( "Maikec" ); product.use(); } }
附录
https://github.com/maikec/pattern 个人GitHub设计模式案例
声明
引用该文档请注明出处