设计模式_创建型模式

创建型模式与对象创建有关.

1. Abstract Factory (抽象工厂)

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用:一个系统要独立于它的产品的创建、组合和表示时。
与工厂模式的区别:工厂模式的一个工厂接口的子类只能实例化一个产品;抽象工厂能实例多个产品。

例子代码:

package designModel;

// 产品1
interface IProduct1 {
}

class Product1A implements IProduct1 {
}

// 扩展产品1 B系列
class Product1B implements IProduct1 {
}

// 产品2
interface IProduct2 {
}

class Product2A implements IProduct2 {
}

// 扩展产品2 B系列
class Product2B implements IProduct2 {
}

// 工厂
interface IFactory {
    IProduct1 getProduct1();

    IProduct2 getProduct2();
};

// 工厂 A ,生产A系列产品
class FactoryA implements IFactory {
    public IProduct1 getProduct1() {
        return new Product1A();
    }

    public IProduct2 getProduct2() {
        return new Product2A();
    }
}

// 工厂 B ,生产B系列产品
class FactoryB implements IFactory {
    public IProduct1 getProduct1() {
        return new Product1B();
    }

    public IProduct2 getProduct2() {
        return new Product2B();
    }

}

public class TestAbstractFactory {
    public void test() {
        IFactory factory = new FactoryA();
        IProduct1 product1A = (IProduct1) factory.getProduct1();
        IProduct2 product2A = (IProduct2) factory.getProduct2();

        // 如果扩展产品系列B时,添加 FactoryB、ProductB即可,不需要修改原来代码
        factory = new FactoryB();
        IProduct1 product1B = (IProduct1) factory.getProduct1();
        IProduct2 product2B = (IProduct2) factory.getProduct2();

    }
}

 2.Builder (构造者模式/生成器)

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。


例子代码:

package designModel;

import org.junit.Test;

class Person {
    private String name;
    private String address;
    private int age;
    private int sex;
    private int height;
    private int weight;

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

    public String getName() {
        return name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getAddress() {
        return address;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public int getSex() {
        return sex;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getHeight() {
        return height;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }
}

class PersonBuilder {
    private Person person;

    public PersonBuilder() {
        this.person = new Person();
    }

    public PersonBuilder name(String name) {
        this.person.setName(name);
        return this;
    }

    public PersonBuilder address(String address) {
        this.person.setAddress(address);
        return this;
    }

    public PersonBuilder age(int age) {
        this.person.setAge(age);
        return this;
    }

    public PersonBuilder sex(int sex) {
        this.person.setSex(sex);
        return this;
    }

    public PersonBuilder height(int height) {
        this.person.setHeight(height);
        return this;
    }

    public PersonBuilder weight(int weight) {
        this.person.setWeight(weight);
        return this;
    }

    public Person build() {
        return person;
    }

}

public class TestBuilder {

    @Test
    public void test() {
        /* Person并不是直接new出来的,对其构造器进行了处理使其可访问范围尽可能的小,
        只让它通过Person.Builder来构建自己,在Person.Builder中提供了一种类set的方法链的方式来设置值,
        然后在最后的build()方法的时候会返回一个Person对象
        * */
        PersonBuilder builder = new PersonBuilder();
        Person person = builder.name("tom")
                .address("shanghai")
                .age(20)
                .sex(2)
                .height(188)
                .weight(140).build();

        System.out.println("person :" + person);

    }
}

3.Factory Method (工厂方法)

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。
适用:当一个类不知道它所必须创建的对象的类的时候。


例子代码:

package designModel2;

interface IProduct {
}

class ProductA implements IProduct {
}

class ProductB implements IProduct {
}

interface IFactory {
    public IProduct getProduct();
}

class FactoryA implements IFactory {
    public IProduct getProduct() {
        return new ProductA();
    }
}

class FactoryB implements IFactory {
    public IProduct getProduct() {
        return new ProductB();
    }
}

// 工厂方法
class Factory {
    public IProduct getProductA() {
        return new ProductA();
    }

    public IProduct getProductB() {
        return new ProductB();
    }

    public IProduct getProduct(int type) {
        if (type == 1) {
            return new ProductA();
        } else {
            return new ProductB();
        }
    }
}

public class TestFactory {
    public static void test() {
        IFactory factory = new FactoryA();
        IProduct product = factory.getProduct();
        //
        factory = new FactoryB();
        product = factory.getProduct();
    }

    public static void main(String[] args) {
        test();
    }
}

4.Prototype (原型方法)

定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
适用:当要实例化的类是在运行时刻指定时;或者需要创建多个对象并且这些对象内部状态相差不大。

例子代码:

package designModel;

class Car implements Cloneable {
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Car clone() {
        try {
            return (Car) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

class Prototype implements Cloneable {
    private int id;
    private Car car;

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Object clone() {
        try {
            boolean deep = true;
            if (deep) {
                /**
                 * 深复制,复制出了两辆车
                 * */
                Prototype prototype = (Prototype) super.clone();
                prototype.setCar((Car) this.car.clone());
                // 继续复制其他引用对象
                return prototype;

            } else {
                /**
                 * 浅复制 ,是同一辆车
                 * */
                return super.clone();
            }
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

public class TestPrototype {
    public void test() {
        Prototype p1 = new Prototype();
        p1.setCar(new Car());
        p1.setId(1);
        // 复制
        Prototype p2 = (Prototype) p1.clone();
        p2.setId(2);
    }
}

 5.Singleton (单例模式)

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

注意

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例


例子代码:

package designModel;

class Singleton {  
    private static Singleton instance = null;
    //让构造函数为 private,这样该类就不会被实例化,对外部来说不可见
    private Singleton() {
    }  // 获取唯一可用的对象
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
public class TestSingleton {
    public void test(){
        // 获取单例
        Singleton singleton = Singleton.getInstance();
    }
}

总结:

Abstract Factory 由这个工厂产生多个对象 ; 工厂模式的区别:工厂模式的一个工厂接口的子类只能实例化一个产品;抽象工厂能实例多个产品。

Builder 由这个工厂使用一个相对复杂的协议,逐步创建复杂产品.

Prototype 由改工厂复制对象来创建产品对象.

原文地址:https://www.cnblogs.com/coloz/p/11427990.html

时间: 2024-08-28 15:41:49

设计模式_创建型模式的相关文章

设计模式_创建型模式_简单工厂模式

转载自:http://blog.csdn.net/lovelion  作者:刘伟 简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:        首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类, 而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类: 然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方

设计模式_创建型模式——工厂方法

工厂方法(Factory Method):工厂方法模式属于类的创建型模式.在工厂方法模式中,父类负责定义创建产品对象的工厂接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类. abstract Product factoryMethod(String type) abstract:工厂方法是抽象的,依赖子类来处理对象的创建 Product:工厂方法返回一个产品,超类中定义的方法,通常使用到工厂方法的返回值 String:工厂方法

设计模式_创建型模式_简单工厂模式_案例

使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具, 每个几何图形都具有绘制draw()和擦除erase()两个方法, 要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException. 结构图如下: AbstractDrawTools  所有绘图工具的基类,是个抽象工厂类,抽取了三个绘图工具的共有方法Draw() Erase()当成抽象方法 这里简化了工厂类,把工厂类中的创建对象的静态方法移植到这个类中. CaspuleTool  胶囊绘图

设计模式_创建型模式_单例模式_案例

转载自:http://blog.csdn.net/lovelion  作者:刘伟 负载均衡器的设计与实现 Sunny公司开发人员通过分析和权衡,决定使用单例模式来设计该负载均衡器,结构图如图3-3所示: 在图中,将负载均衡器LoadBalancer设计为单例类,其中包含一个存储服务器信息的集合serverList, 每次在serverList中随机选择一台服务器来响应客户端的请求,实现代码如下所示: LoadBalance: 1 namespace SingletonPattern 2 { 3

设计模式之创建型模式(上)

没有总结的学习不算学习,这一个月的学习可谓收获多多啊,接下来与大家分享一下. 一.设计模式的分类 总体来说设计模式分为三大类: 1.创建型模式,共五种. 2.结构型模式,共七种. 3.行为型模式,共十一种. 首先研究创建型模式 二. 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独 立于如何创建.组合和表示它的那些对象. 三. 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律: 第一,它们都将系统使用哪些具体类的信息封装起来: 第二,它们隐藏了这些类的实例

设计模式 (创建型模式)

  设计模式 创建型模式 1.创建型模式         创建型模式,包括了5种设计模式,分别是 Singleton (单例模式),Factory(工厂模式),AbstractFactory(抽象工厂模式),Builder(创建者),Prototype(原型) ,创建型模式主要作用就是抽象了实例化过程.他们帮助一个系统独立于如何创建.组合和表示他的那些对象.一个类创建型模式使用继承改变被实例化的类.而一个对象创建型模式将实例化委托给另一个对象. 2.Singleton (单例模式)      单

设计模式系列 - 创建型模式

单例模式 懒汉式,线程不安全. 除非是单线程程序,否则不推荐使用. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 饿汉式,线程安全 当程序总是使用这个

设计模式之创建型模式

一.前言 设计模式应该是在软件工程的背景下进行讨论的,而不是为了设计模式而论设计模式.设计模式是软件工程面向对象设计工作中一个抽象.归纳.总结的过程.软件设计的最高目标和最高准则就是易扩展,易复用,易维护, 灵活性高,高可用,稳定性高一切的设计原则和设计模式最终的目标都是向这个目标靠拢的. 二.面向对象设计六大原则 任何的设计模式都是基于面向对象的特性(抽象.封装.继承.多态)和设计原则进行设计和实现的,是面向对象设计原则的在不同场景下的实现方案. 抽象:抽离变化的部分,引入抽象层,实现具体实现

Java设计模式之创建型模式

创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类-工厂类 工厂类的目的是为了产生Sender对象,通过不同的参数传入产生不同的对象. 将工厂类中的工厂方法改为多个工厂方法即为多个工厂方法的设计模式 将工厂类中的工场方法改为static即为静态工厂方法设计模式 二.抽象工厂方法模式:接口-实现类-工厂类 特点是: 工厂类实现某个接口,利于以后扩展,比如可以增加BlueTooth的工厂类. 工厂设计模式是抽象工厂设计模式的一个特例. 三.