设计模式之工厂模式

工厂模式中有三种:简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式

简单工厂模式其实不是一个设计模式,应该说是一个编程的习惯。

UML图:

这个是一个做披萨的例子,是Head First书中的例子。简单工厂模式就是将new 的方法放入一个工厂的类中,下面我们给出代码:

package com.jd.factory.staticFactory;


public class Pizza {

    public void prepare(){
        System.out.println("1");
    }

    public void bake(){
        System.out.println("2");
    }

    public void cut(){
        System.out.println("3");
    }
    public void box(){
        System.out.println("4");
    }
}

class Main{

    public Pizza orderPizza(String type){
        //我现在需要多种类型的对象
//        Pizza pizza = new Pizza();

        //这个时候如果我们新增pizza的种类会很麻烦,所以我们将变得代码拿出来,使用一个factory来创建对象
//        Pizza pizza = null;
//        if (type.equals("cheese")){
//             pizza = new CheesePizza();
//        }else if (type.equals("qreek")){
//             pizza = new QreekPizza();
//        }

        //这样的话PizzaFactory就是一个简单工厂
        PizzaFactory pizzaFactory = null;
        Pizza pizza = pizzaFactory.createPizza(type);


        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

}

class PizzaFactory{
    public  Pizza createPizza(String type){
        Pizza pizza = null;
        if (type.equals("cheese")){
             pizza = new CheesePizza();
        }else if (type.equals("qreek")){
             pizza = new QreekPizza();
        }
        return pizza;
    }
}

class CheesePizza extends Pizza
{
    public void prepare(){
        System.out.println("1");
    }

    public void bake(){
        System.out.println("2");
    }

    public void cut(){
        System.out.println("3");
    }
    public void box(){
        System.out.println("4");
    }
}

class QreekPizza extends Pizza{


    public void prepare(){
        System.out.println("1");
    }

    public void bake(){
        System.out.println("2");
    }

    public void cut(){
        System.out.println("3");
    }
    public void box(){
        System.out.println("4");
    }
}

简单工厂就不多说了,上面的UML图挺清楚的。

工厂方法模式

 1、意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

2、动机

框架使用抽象类定义和维护对象之间的关系,这些对象的创建通常也有框架负责。

3、适用性

  • 当一个类不知道他所必须创建的对象的类的时候
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理这一信息局部化的时候。

4、结构

5、参与者

  • Product

定义工厂方法所创建的对象的接口。

  • ConcreteProduct

实现Product接口。

  • Creator

声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的省缺实现,它返回一个省缺的ConcreteProduct对象。

可以调用工厂方法以创建一个Product对象。

  • ConcreteCreator 

重定义工厂方法已返回一个ConcreteProduct实例。

6、实现

package com.jd.factory;

//当简单的工厂不能满足我们的需求,我们将pizza分为两大模块,一个是NY的,一个是Chicago的,这两大类之下又有各种pizza,相当于我们的对象有两个维度的分类
//这个时候我们就不能通过一个工厂来创建。

public class Mian{
    public static void main(String[] args)  {
        FactoryMethod factory = new NYFactory();
        Pizza pizza = factory.orderPizza("cheese");
    }
}

abstract class FactoryMethod {
    public Pizza orderPizza(String type){
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
    abstract Pizza createPizza(String type);
}

class Pizza{

    public void prepare(){
        System.out.println("1");
    }

    public void bake(){
        System.out.println("2");
    }

    public void cut(){
        System.out.println("3");
    }
    public void box(){
        System.out.println("4");
    }
    public void addSHI(){
        System.out.println("shijiahaole");
    }
}


class NYFactory extends FactoryMethod{
    public Pizza createPizza(String type){
        Pizza pizza;
        if (type.equals("cheese")){
            pizza = new NYCheesePizza();
        }else if (type.equals("qreek")){
            pizza = new NYQreekPizza();
        }else{

            pizza = null;
        }
        return pizza;
    }
}

class ChicagoFactory extends FactoryMethod{
    public Pizza createPizza(String type){
        Pizza pizza = null;
        if (type.equals("cheese")){
            pizza = new ChicagoCheesePizza();
        }else if (type.equals("qreek")){
            pizza = new ChicagoQreekPizza();
        }
        return pizza;
    }
}




class NYCheesePizza extends Pizza{

}

class ChicagoCheesePizza extends Pizza{

}

class NYQreekPizza extends Pizza{

}

class ChicagoQreekPizza extends Pizza{

}

抽象工厂模式

1、意图

提供一个接口以创建一系列 相关或相互依赖 的对象,而无须指定它们具体的类。

2、适用性

  • 一个系统要独立与它的产品创建、组合和表示。
  • 一个系统要由多个产品系列中的一个来配置。
  • 要强调一系列相关的产品对象的设计以便进行联合使用。
  • 提供一个产品类库,但只想显示它们的接口而不是实现。 

3、结构 

4、参与者

  • AbstractFactory

声明一个创建抽象产品对象的操作接口。

  • ConcreteFactory

实现创建具体产品对象的操作

  • AbstractProduct

为一类产品对象声明一个接口

  • ConcreteProduct

定义一个将被相应的具体工厂创建的产品对象

实现AbstactProduct接口

  • Client

仅使用由AbstractFactory和AbstractProduct类声明的接口。

5、实现

package com.jd.factory;

public class AbstractFactory {


}

abstract class Factory{

    abstract Button createButton();

    abstract Text createText();

}

class MacFactory extends Factory {

    @Override
    Button createButton() {
        return new MacButton();
    }

    @Override
    Text createText() {
        return new MacText();
    }
}

class LinuxFactory extends Factory {

    @Override
    Button createButton() {
        return new LinuxButton();
    }

    @Override
    Text createText() {
        return new LinuxText();
    }
}

class WinFactory extends Factory {

    @Override
    Button createButton() {
        return new WinButton();
    }

    @Override
    Text createText() {
        return new WinText();
    }
}

class Text{

}

class MacText extends Text {

}

class LinuxText extends Text {

}

class WinText extends Text {

}

class Button{

}

class MacButton extends Button{

}

class LinuxButton extends Button{

}

class WinButton extends Button{

}

工厂模式我们就讲到这里,接着我们来学习四个十分相近的设计模式:

适配器模式、桥接模式、装饰者模式、代理模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值