设计模式 (四)抽象工厂模式

版权声明: https://blog.csdn.net/if_i_were_a/article/details/83017190

在有道云笔记上写的,抽象工厂模式

http://note.youdao.com/noteshare?id=684ceb68fafe75e7f2b273d0460e8420&sub=0540A1F277B245A494CB02E223440771

抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们具体的类

抽象工厂模式的优点:易于交换产品系列,在一个应用中只需要在初始化的时候出现一次。它让具体的创建实例与客户端相分离,不会出现在客户端的代码中

缺点:如果要增加一个产品的话,需要改动的类很多

这是我写的三个例子:每个part下面一个例子

part01:抽象工厂模式

抽象工厂模式的类图如下:(选自大话设计模式,ps我的所有的设计模式的图片都来自这里)

以下是代码

public abstract class AbstractProductA {

public AbstractProductA() {

}

}

public abstract class AbstractProductB {

public AbstractProductB() {

}

}

public class ProductA1 extends AbstractProductA {

public ProductA1() {

}

}

public class ProductA2 extends AbstractProductA {

public ProductA2() {

}

}

public class ProductB1 extends AbstractProductB {

public ProductB1() {

}

}

public class ProductB2 extends AbstractProductB {

public ProductB2() {

}

}

public abstract class AbstractFactory {

public abstract AbstractProductA createProductA();

public abstract AbstractProductB createProductB();

}

public class ConcreteFactory1 extends AbstractFactory {

@Override

public AbstractProductA createProductA() {

System.out.println("工厂一生产产品A1");

return new ProductA1();

}



@Override

public AbstractProductB createProductB() {

System.out.println("工厂一生产产品B1");

return new ProductB1();

}

}

public class ConcreteFactory2 extends AbstractFactory {

@Override

public AbstractProductA createProductA() {

System.out.println("工厂二生产产品A2");

return new ProductA2();

}



@Override

public AbstractProductB createProductB() {

System.out.println("工厂二生产产品B2");

return new ProductB2();

}

}

public class Client {

public static void main(String[] args) {

AbstractFactory af=new ConcreteFactory2();

af.createProductA();

af.createProductB();



}

}

加入我现在要加一个产品C,需要改变的类由AbstractProduct,ConctreteFactory1,,ConctreteFactory2,这是很麻烦的,所以不如简单工厂模式来的痛快

part01:针对以上问题写的简单工厂模式

public abstract class AbstractProductA {

public AbstractProductA() {

}

}

public abstract class AbstractProductB {

public AbstractProductB() {

}

}

public class ProductA1 extends AbstractProductA {

public ProductA1() {

}

}

public class ProductA2 extends AbstractProductA {

public ProductA2() {

}

}

public class ProductB1 extends AbstractProductB {

public ProductB1() {

}

}

public class ProductB2 extends AbstractProductB {

public ProductB2() {

}

}

public class SimpleFactory {

public SimpleFactory() {

}



public AbstractProductA createProductA(String h){

AbstractProductA a;

switch (h)

{

case "A1":

a=new ProductA1();

System.out.println("生产A1");

break;

case "A2":

a=new ProductA2();

System.out.println("生产A2");

break;

default:

a=null;

break;

}

return a;

}

public AbstractProductB createProdutB(String h){

AbstractProductB b;

switch (h)

{

case "B1":

b=new ProductB1();

System.out.println("生产B1");

break;

case "B2":

b=new ProductB2();

System.out.println("生产B2");

break;

default:

b=null;

break;

}

return b;

}

}

public class Client {

public static void main(String[] args) {

SimpleFactory simpleFactory=new SimpleFactory();

simpleFactory.createProductA("A1");

simpleFactory.createProdutB("B2");



}

}

但是正如你知道的,简单工厂模式违背了开放-封闭原则,所以part03是用反射解决这个问题的

public abstract class AbstractProductA {

public AbstractProductA() {



}

}

public abstract class AbstractProductB {

public AbstractProductB() {

}

}

public class ProductA1 extends AbstractProductA {

public ProductA1() {

}

}

public class ProductA2 extends AbstractProductA {

public ProductA2() {

}

}

public class ProductB1 extends AbstractProductB {

public ProductB1() {

}

}

public class ProductB2 extends AbstractProductB {

public ProductB2() {

}

}

public class Factory {

public Class createProductA(String h) throws ClassNotFoundException {

if(h=="A1"||h=="A2") {

Class a = Class.forName("AbstractFactory.part03.Product"+h);

System.out.println("生产产品"+h);

return a;

}

else

{

return null;

}

}

public Class createProductB(String h) throws ClassNotFoundException {

if(h=="B1"||h=="B2") {

Class b = Class.forName( "AbstractFactory.part03.Product"+h);

System.out.println("生产产品"+h);

return b;

}else

{

return null;

}

}

}

public class Client {

public static void main(String[] args) throws ClassNotFoundException {

Factory f=new Factory();

f.createProductA("A1");

f.createProductA("A2");

f.createProductB("B1");

f.createProductB("B2");

}

}

这个是最有效的方法啦

猜你喜欢

转载自blog.csdn.net/if_i_were_a/article/details/83017190
今日推荐