当前位置:首页 > 未命名 > 正文内容

工厂模式和抽象工厂概述以及二者的区别

u3blog8年前 (2016-11-10)未命名410

工厂模式

什么是工厂模式

顾名思义,工厂模式就是一种生产产品的模式,我们这里的产品就是各种各样的对象

工厂模式的类图

如图所示: 1.我们有一个抽象类,工厂,两个具体实现,NYstore和Bstore,实现了抽象工厂的几个方法 2.我们有一种产品,pizza,并且对于它我们有很多实现,分为ny系和b系,不过他们都是pizza 当我们需要pizza的时候,我们只要用一个store对象的创建方法来点餐就可以了,工厂类会根据其类型的不同创建相应的pizza给我们吃。 调用代码:
public class FactoryDriver {
    public static void main(String[] args){
        PizzaStore nystore = new NYStore();//创建store
        PizzaStore shstore = new SHStore();//创建另一个store
        Pizza shchess = shstore.createPizza("chess");//点一个chess pizza
        System.out.println(shchess.getName());//我们发现,在sh点的chess是上海风味!
        Pizza nychess = nystore.createPizza("chess");
        System.out.println(nychess.getName());//我们发现,在ny点的chess是纽约风味!
    }
}

抽象工厂

什么是抽象工厂

简单的说,抽象工厂就是加强的工厂模式,工厂模式只能生成一种产品,比如披萨工厂只能生成披萨,然而,我们的抽象工厂,可以生产全家桶!薯条,可乐,鸡腿,煎饼果子,这些都能生产!

抽象工厂的类图

1.如图所示,我们的thingfactory定义了几个创建方法,可以让我们生产特定的套餐,里面包含thing1,thing2,thing3,可以是啤酒,薯条,鸡腿 2.然后我们的两个具体类来实现了生产这个套餐的过程,左边的啤酒,薯条,鸡腿又分成了两派 3.我们的具体工厂是怎么生产啤酒,薯条,鸡腿呢?我们的北京商店有可能提供,北京特产咖啡味啤酒,北京特产红酒味啤酒,当然要用我们上面说的工厂方法! 怎么使用抽象工厂呢?看代码!

Factory

public class HKFactory implements PizzaIngredientFactory {
    @Override
    public Dough createDough() {
        return new HKDough();
    }

    @Override
    public Sauce createSauce() {
        return new HKSauce();
    }
}

HKPizza

public class HKpizza extends Pizza {
    PizzaIngredientFactory factory;
    Sauce sauce;
    Dough dough;
    public HKpizza(PizzaIngredientFactory factory){
        this.factory = factory;
        this.sauce = factory.createSauce();
        this.dough = factory.createDough();
    }//我们的pizza现在是一个组合套餐了,里面有好几个成员

}

HKStore

public class HKStore implements Store{
    PizzaIngredientFactory factory = new HKFactory();
    @Override
    public Pizza orderPizza(String name) {
        if (name.equals("pizza"))
        return new HKpizza(factory);
        else
            return null;
    }
}

Driver

//最外层还是跟我们的工厂方法一样
public class Driver {

    public static void main(String[] args){
    Store hkstore = new HKStore();
    Store nystore = new NYStore();
    Pizza pizza =  hkstore.orderPizza("HKpizza");
        Pizza pizza1 =  nystore.orderPizza("NYpizza");
    }
}

抽象工厂和工厂的同异

相同点

1.都是生产对象的方法 2.都把使用者和具体类型解绑了 3.抽象工厂生产套餐的具体元素的时候经常使用工厂方法(比如生产套餐里的可乐的时候,用了可乐工厂来根据不同地区生产不同可乐),再把他们组合起来,形成套餐

不同点

1.创建方式不同,工厂创建一个新对象使用的是继承现有工厂类然后复写工厂方法,而抽象工厂是使用了类的组合 2.针对的对象不同,工厂方法主要针对是一种产品,比如,可乐,薯条其中的一种,而抽象工厂却是针对一系列产品,比如薯条和可乐的组合套餐,也可以称之为产品族 3.1当需要新增一种产品的时候,在工厂方法中,我们只需要增加一种产品实例,并在具体工厂中加入生产这种实例的判断条件就可以了。 3.2在抽象工厂中新增一个元素(比如在现有套餐中加送一块鸡腿),我们需要改工厂接口,新增这个鸡腿的接口,并修改这个接口的实现,新增这个方法并实现,在这个实现里来创建这个赠送的鸡腿

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=509

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。