工厂模式+抽象工厂+建造者模式

part1

工厂模式

实现产品与创建产品解耦

 

 这里我用了两个工厂,每个工厂分别创建productA, productB,这里可以只写其中一个,IProduct, ProductA, IFactory, FactoryA, 我只是想写多个工厂而已。 这里我想创建两种产品(ProductA, ProductB)用到了两个工厂(FactoryA, FactoryB)

代码:

public interface IProduct {
    public void show();
}

public class ProductA implements IProduct {
    @Override
    public void show() {
        System.out.println("show productA");
    }
}

public class ProductB implements IProduct {
    @Override
    public void show() {
        System.out.println("show productB");
    }
}

public interface IFactory {
    public IProduct createProduct();
}

public class FactoryA implements IFactory {
    @Override
    public IProduct createProduct() {
        IProduct p = new ProductA();
        return p;
    }
}

public class FactoryB implements IFactory {
    @Override
    public IProduct createProduct() {
        IProduct p2 = new ProductB();
        return p2;
    }
}

public class Test {
    public static void main(String[] args) {
        //这里只是自己创建工厂A, 工厂B。对于工厂模式,写其中一个就可以。
        IFactory factoryA = new FactoryA();
        IProduct p1 = factoryA.createProduct();

        IFactory factoryB = new FactoryB();
        IProduct p2 = factoryB.createProduct();

        p1.show();
        p2.show();
    }
}

测试结果:

 

part2

抽象工厂,也是实现产品与创建产品解耦,与工厂模式不同的是,抽象工厂是一个工厂创建一族类似的产品,而工厂模式是一个工厂只创建一个产品。 所以在加入产品和减少产品的时候,抽象工厂和工厂模式可以互相转换。

 

 

 这里的代码就比较上面单一一点。没有测用多个工厂(也可以用多个工厂创建更多的就不赘述了)

代码:

interface IProduct1 {
    public void show();
}

public interface IProduct2 {
    public void show();
}

public class Product1ImplA implements IProduct1 {
    @Override
    public void show() {
        System.out.println("show product1");
    }
}

public class Product2ImplA implements IProduct2 {
    @Override
    public void show() {
        System.out.println("show product2");
    }
}


/**
 * 注意这里与工厂方法不同, 这里是一个工厂创建一族类似的产品。而工厂方法一个工厂只创建一个产品
 */
public interface IFactory {
    public IProduct1 createProduct1();
    public IProduct2 createProduct2();
}

public class Factory implements IFactory {
    @Override
    public IProduct1 createProduct1() {
        IProduct1 p = new Product1ImplA();
        return p;
    }

    @Override
    public IProduct2 createProduct2() {
        IProduct2 p = new Product2ImplA();
        return p;
    }
}

public class Test {
    public static void main(String[] args) {
        IFactory f = new Factory();
        //一个工厂能创建两种产品
        IProduct1 p1 = f.createProduct1();
        IProduct2 p2 = f.createProduct2();
        p1.show();
        p2.show();
    }
}

测试结果:

 

 

 

part3

建造者模式

建造者模式与工厂方法的不同在于,工厂方法就是一个产品,一个工厂。产品的所有创建过程全部在工厂类中,工厂提供最终产品。

建造者模式多引入了一个导演类,建造者类提供组件的创建过程, 导演类完成具体建造。由导演类按具体实际的要求创建对象,然后提供给客户端。

所以简单一些对象创建过程用工厂方法,更为复杂的用建造者模式。

代码:

 

 

/**
 * 为了简洁这里的产品没有用接口,这里可以像上面一样用接口
 */
public class Product {
    private String name;
    private String type;

    public void show() {
        System.out.println(name + " " + type);
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setType(String type) {
        this.type = type;
    }
}

public interface IBuilder {
    public Product getProduct();
    public void setPart(String name, String type);
}

public class ConcreteBuilder implements IBuilder {
    Product p = new Product();
    @Override
    public Product getProduct() {
        return p;
    }

    @Override
    public void setPart(String name, String type) {
        p.setName(name);
        p.setType(type);
    }
}

public class Director {
    public Product getProductA() {
        ConcreteBuilder c1 = new ConcreteBuilder();
        c1.setPart("a", "typeA");
        Product product = c1.getProduct();
        return product;
    }

    public Product getProductB() {
        ConcreteBuilder c2 = new ConcreteBuilder();
        c2.setPart("b", "typeB");
        Product product = c2.getProduct();
        return product;
    }
}

public class Test {
    public static void main(String[] args) {
        Director d = new Director();
        Product productA = d.getProductA();
        Product productB = d.getProductB();

        productA.show();
        productB.show();
    }
}

 

 测试结果:

 

posted @ 2021-05-12 12:48  圣金巫灵  阅读(250)  评论(0编辑  收藏  举报